[Evento] Seminario Xamarin en Avante

Introducción

No hay duda, los smartphones han llegado, y ya forman parte de la
vida de todos nosotros. En muchos aspectos de nuestra vida accedemos a
información, realizamos algna tarea o sencillamente nos entretenemos con
uno de ellos.

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 Phone

Esto a nivel de desarrollo nos supone barreras. Contamos con
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 multiplataforma. Entre
las opciones disponibles, una de las más destacadas y en auge es Xamarin.

Xamarin permite el desarrollo de aplicaciones móviles nativas multiplataforma utilizando C#.
Además, poder compartir una gran cantidad de código, outilizar Visual
Studio como IDE lo convierte en una excelente opción para muchos
desarrolladores.

El evento

En Avante junto con Bravent han preparado un seminario gratuito donde
abordaremos las posibilidades de Xamarin para desarrollar Apps móviles
multiplataforma nativas. Veremos aportes, costes, estructura de proyectos, servicios y
mucho más de la manera más práctica posible. Además, tendremos alguna
que otra sorpresa con los asistentes.

Fecha

El evento tendrá lugar el próximo Martes, 19 de Mayo de 16:00h a 16:30h. Tendremos tres sesiones de 2:30 horas de duración en total.

Lugar

Tendrá lugar en Avante situado en La Cartuja. Tenéis la información exacta del lugar a continuación:

C/ Torricelli, 26, 41092 Sevilla

Agenda

La agenda sera la siguiente:

  • 16:00h – 17:00h: Introducción a Xamarin El mercado
    móvil es hoy día un pilar importante tanto para usuarios como para
    desarrolladores. Sin embargo, tenemos un mercado amplio y diverso con
    una gran variedad de dispositivos y sistemas. Si entramos en el terrero
    de desarrolladores el problema se acentúa con diferentes entornos de
    desarrollo, lenguajes y otros elementos. En esta sesión repasaremos el
    estado actual, introduciremos Xamarin como herramienta para crear
    aplicaciones nativas multiplataforma desde Visual Studio analizando
    todas sus bondades y costes además de ver distintas opciones Xamarin
    Classic y Xamarin.Forms.
  • 17:00h – 18:00h: Arquitectura de Apps multiplataforma con Xamarin Nuestro
    objetivo como desarrolladores es crear aplicaciones útil y atractivas
    pero sobretodo perfectamente funcionales. Para poder lograr ese objetivo
    es sin duda muy importante la arquitectura aplicada a la App. En esta
    sesión repasaremos el patrón MVVM aplicándolo a una aplicación Xamarin
    en cada una de las plataformas paso a paso así como la cantidad de
    código que se puede llegar a compartir entre plataformas tanto en
    ejemplos como en Apps reales.
  • 18:00h – 18:30h: Conociendo el resto de ecosistema Xamarin
    El ecosistema Xamarin no cesa en las herramientas de desarrollo.
    Tenemos a disposición una gran variedad de servicios destinados a
    complementar el mismo, analíticas, testing, análisis de rendimiento,
    etc. En esta sesión vamos a hacer un repaso por todos los servicios
    disponibles realizando demos de cada uno de ellos.

¿Te apuntas?

Más información

[Evento WPSUG] Repasando las novedades del BUILD 2015

Introducción

Tras un BUILD 2015 intenso con una enorme cantidad
de novedades, material y alguna que otra incónita en el aire, ¿que mejor
que reunir a un grupo de desarrolladores que han asistido y otros que
han seguido y probado novedades para analizarlas?

El evento

El próximo Jueves 7 de Mayo, a las 19:00 (GMT+1) Josué Yeray, Rafa Serna, Santiago Porras, Alejandro Campos y un servidor estaremos
en un nuevo Hangout en el que se realizará un desglose en todas las
novedades presentadas relacionadas con el desarrollo en la paltaforma
Windows. Veremos novedades a nivel de desarrollo de Apps Windows 10,
trataremos los Bridges viendo sus posibilidades y limitaciones o novedades en HoloLens entre otro conjunto de novedades.

  • 19:00 en España
  • 13:00 en Colombia
  • 12:00 en México Centro
  • 13:30 en Venezuela
  • 15:00 en Chile continental

¿Te apuntas?

Más información

[Hackathon] Windows 10 Game Jam en Sevilla

Introducción

Poniéndonos algo nostálgicos, podemos recordar el verano del año
2013, donde en Twitter, surgió una iniciativa brutal por rapidez y
alcance. Jose Bonnin (Evangelism Management en Microsoft) publicó un
tweet comentando los hackathons de Windows 8 que se estaban celebrando
en Barcelona y Mallorca. A partir de ese tweet varios desarrolladores
empezaron a preguntar si era posible celebrar un hackathon en su ciudad.
Todo corrió como la pólvora hasta llegar a lo que fue el Megathon
(Hackathon Windows 8 a nivel nacional). Con éxito abrumador tuvo
repetición aun más exitosa al año siguiente.

Un fin de semana intenso donde con un trasfondo de sana competición
se consigue aprender, compartir y hacer mucho networking entre todos los
participantes.

Windows 10 ha llegado como la culminación en el viaje hacia la convergencia en el desarrollo entre plataformas Windows. Ahora hablamos de Apps Universales
escritas una única vez con un código comun tanto para la lógica de
negocio como para la interfaz de usuario. Además, generamos un único paquete
que mantendrá una interfaz consistente y familiar para el usuario pero
adaptada a cada plataforma. Con las herramientas de desarrollo de
Windows 10 disponibles, había una oportunidad excelente para crear un
nuevo Hackathon, ¿verdad?

Windows 10 Game Jam

Desde el 15 al 17 de Mayo tendremos la Windows 10 Game Jam, Hackathon de desarrollo de Apps y juegos para Windows 10.

Windows 10 Game Jam

El Viernes 15 tendremos múltiples sesiones técnicas relacionadas con
el desarrollo de Apps Windows 10, mientras que Sábado 16 y Domingo 17
tendra lugar la competición en si realizando la entrega de premios el
Domingo, de 17:00h a 19:00h.

Las sesiones técnicas

El Viernes tendremos múltiples sesiones técnicas
donde se iran analizando todas las novedades principales a nivel de
desarrollo a la hora de crear Apps Windows 10. La agenda sera la
siguiente:

  • 10:00-11:00: Introducción a las Apps UAP Conoceremos
    la plataforma de Apps Universales (UAP) y como nos permite la creación
    de una App con un mismo paquete funcionando en todos los dispositivos
    Windows 10. Crearemos nuestra primera App UAP conociendo la estructura
    del proyecto aplicando buenas prácticas e implementando el patrón MVVM.
    Además, exploraremos los SDKs de extensión viendo cómo utilizar APIs
    específicas por plataforma o como crear vistas por familia de
    dispositivos.
  • 11:00-12:00: Interfaces adaptativas en Windows 10 Comenzaremos
    viendo las posibilidades del control RelativePanel, nuevo control de
    Layout que permite posicionar a los elementos de forma relativa con
    respecto al panel y ellos mismos facilitando además la adaptación de los
    elementos de la interfaz ante cambios de orientación o tamaño de
    pantalla. Además, daremos un vistazo a los Adaptive Triggers utilizados
    en XAML para detectar condiciones de entorno como distintos tamaños de
    pantalla permitiéndonos aplicar distintos estados visuales para adaptar
    la interfaz a cada dispositivo.
  • 12:30-13:30: Nuevos controles en Windows 10 Exploraremos
    los nuevos controles XAML disponibles en Windows 10 realizando especial
    hincapié en el control SplitView que nos permite crear una barra de
    navegación flexible ante distintas opciones de layout.
  • 15:00-16:00: Nuevas APIs disponibles en Windows 10 Ante
    tal cantidad de nuevas posibilidades disponibles en nuevas APIs no
    podíamos dejar atrás un repaso ante las novedades principales. Nuevas
    posibilidades de comunicación entre Apps UAP, el Action Center ahora
    disponible en teléfonos, tabletas y PCs, la captura de escritura con
    pens entre otras novedades.
  • 16:00-17:00 Migración de Windows 8.1 a Windows 10 Explicaremos
    el proceso de migración de una App Windows Store o Windows Phone 8.1 a
    UAP. Las Apps para Windows 8.1 funcionan en Windows 10, pero con la
    llegada de la nueva plataforma tenemos una gran cantidad de
    características de las que tomar ventaja o sencillamente extender a
    otras familias de dispositivos.

 NOTA: Del 29 de Abril al 1 de Mayo tendra lugar el //BUILD 2015 en San Francisco donde se esperan novedades a nivel de desarrollo en Windows 10. La agenda actual es provisional.

El Hackathon

El Sábado de 10:30h a 19:00h y el Domingo de 10:30h a 17:00h
los participantes tendran tiempo para desarrollar aplicaciones o juegos
para Windows 10. Es necesario traer equipo de desarrollo propio pero no
os preocupéis por otros aspectos, siempre habra coordinadores
encantados de ayudar resolviendo dudas, aportando ideas en todo lo
necesario, tendremos catering, conexión a internet y todas las
condiciones para focalizar toda la atención en aprender, compartir y
desarrollar.

Podréis participar en equipos de hasta cuatro miembros. Si no tenéis
los equipos ya formados el propio Viernes se coordinara y ayudara a
formar equipos lo más compensados posibles dependiendo de las
habilidades de cada miembro.

Edificio VilamarTendrá lugar en el Cloud Pointing de Sevilla situado en el Parque Empresarial Nuevo Torneo. Tenéis la información exacta del lugar a continuación:

c Biología, 12, Edificio Vilamar 2, 3ª Planta
Parque Empresarial Nuevo Torneo
41015 Sevilla

Premios

Habra detalles para todos los participantes y
por supuesto, premios para los ganadores. Esta orientado tanto a
profesionales como a estudiantes, contando con dos categorias y premios
para cada una de ellas. Los ganadores en cada categoría recibiran
teléfono Lumia 635.

¿Te parece poco?

Si te parece poco, Microsoft esta organizando el evento en muchas otras ciudades alrededor del mundo:

  • Marousi, Greece (May 14)
  • Zagreb, Croatia (May 14)
  • Bucharest, Romania (May 15)
  • Kyiv, Ukraine (May 15)
  • Seville, Spain (May 15)
  • Budapest, Hungary (May 15)
  • Lima, Peru (May 15)
  • Santiago, Chile (May 15)
  • Danang, Vietnam (May 16)
  • Colombo, Sri Lanka (May 16)
  • Tallinn, Estonia (May 16)
  • Bratislava, Slovakia (May 16)
  • brno, Czech Republic (May 16)
  • Prague, Czech Republic (May 16)
  • Madgeburg, Germany (May 16)
  • Lisbon, Portugal (May 17)
  • Turku, Finland (May 20)
  • Milan, Italy (May 20)
  • Rzeszów , Poland (May 22)
  • Bordeaux, France (May 22)
  • Paris, France (May 22)
  • Toulouse, France (May 22)
  • Mexico City, Mexico (May 22)
  • Munchen, Germany (May 23)
  • San Juan, Puerto Rico (May 29)
  • Beijing, China (Jun 5)
  • Bangkok, Thailand (Jun 6)
  • Yorkshire, UK (Jun 11)
  • Vienna, Austria (Jun 12)
  • Gurgaon, India (Jun 16)
  • Trichy, India (Jun 18) R
  • Bogota, Colombia (Jun 18)
  • Jabalpur, India (Jun 21)
  • Visakhapatnam, India (Jun 23)

Donde tendremos también otras ciudades en España como Cádiz, con quien se realizaran conexiones en directo entre otras sorpresas.

¿Te apuntas?

Más información

[Windows 10] MVVM en Apps Windows

Introducción

Con la llegada de las herramientas de desarrollo de Windows 10 Technical Preview tenemos la culminación en el viaje hacia la convergencia en el desarrollo entre plataformas Windows.

Ahora hablamos de Apps Universales escritas una
única vez con un código comun tanto para la lógica de negocio como para
la interfaz de usuario. Además, generamos un único paquete que mantendrá una interfaz consistente y familiar para el usuario pero adaptada a cada plataforma.

Además de lanzarnos de pleno a analizar nuevos controles, APIs y
herramientas, debemos abordar como implementar el patrón MVVM en Apps
UAP para conseguir una buena arquitectura y compartir código.

El patrón MVVM

Model-View-ViewModel (MVVM) es un patrón de diseño de aplicaciones que permite desacoplar el código de interfaz de usuario del código que no sea de interfaz de usuario.

El patrón MVVM consta de 3 partes:

  • La vista (View) contiene la interfaz de usuario y su lógica.
  • El vista-modelo (ViewModel) contiene la lógica de presentación.
  • El modelo (Model) contiene la lógica de negocio junto a los datos.

La vista interactúa con el vista-modelo mediante enlace a datos (Data Binding) y mediante comandos:

Las ventajas conseguidas utilizando el patrón son significativas:

  • Nos permite dividir el trabajo de manera muy sencilla (diseñadores – desarrolladores)
  • El mantenimiento es más sencillo.
  • Permite realizar Test a nuestro código.
  • Permite una más fácil reutilización de código.

MVVM en escena!

Realmente podemos mantener una implementación MVVM muy similar a como hacíamos hasta ahora en Apps Universales Windows y Windows Phone 8,1.

Crearemos un nuevo proyecto UAP:

Comenzamos por la base. Contamos con dos ficheros clave en nuestro proyecto Universal para implementar el patrón MVVM:

  • PageBase
  • ViewModelBase

PageBase

Como revelamos con su nombre, será una clase de la que heredaran
todas las páginas de nuestra aplicación. Y si, comentamos que serán
todas las páginas de la aplicación (ya sean del proyecto Windows o del
proyecto Windows Phone). Las páginas en ambas plataformas es exactamente
igual, un objeto de tipo Page. Esta clase cuenta con varios objetivos:

  • Establecer el Frame activo en todo momento para que el acceso al mismo sea sencillo.
  • Permitir el acceso de los eventos de navegación desde nuestras viewmodels.

Además podría interesarnos además:

  • Gestionar las transiciones entre páginas.
  • Gestionar estados (Loading, etc.)
  • Gestionar el estado segun la conexión de red.

Con la funcionalidad básica (facilitarnos el acceso a Frame y eventos de navegación) quedaría:

public class PageBase : Page
{
        private ViewModelBase _vm;
 
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
 
            _vm = (ViewModelBase)this.DataContext;
            _vm.SetAppFrame(this.Frame);
            _vm.OnNavigatedTo(e);
        }
 
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            _vm.OnNavigatedFrom(e);
        }
}

Gestionamos los eventos básicos de navegación (al entrar y al salir de la página) de modo que, en el método OnNavigateTo obtenemos la viewmodel de la página y asignamos el Frame.

ViewModelBase

Continuamos con la segunda de nuestras clases base. En esta ocasión
trataremos la clase base de la que heredarán todos los viewmodels. Los
objetivos básicos de la clase son:

  • Notificar cambios (implementar INotifyPropertyChanged).
  • Acceso al objeto Frame que nos permitirá realizar la navegación.
  • Permitir el acceso a los eventos de navegación.
public abstract class ViewModelBase : INotifyPropertyChanged
{
        private Frame appFrame;
        private bool isBusy;
 
        public ViewModelBase()
        {
        }
 
        public Frame AppFrame
        {
            get { return appFrame; }
        }
 
        public bool IsBusy
        {
            get { return isBusy; }
            set
            {
                isBusy = value;
                RaisePropertyChanged();
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        public abstract Task OnNavigatedFrom(NavigationEventArgs args);
 
        public abstract Task OnNavigatedTo(NavigationEventArgs args);
 
        public void RaisePropertyChanged([CallerMemberName]string propertyName = "")
        {
            var Handler = PropertyChanged;
            if (Handler != null)
                Handler(this, new PropertyChangedEventArgs(propertyName));
        }
 
        internal void SetAppFrame(Frame viewFrame)
        {
            appFrame = viewFrame;
        }
}

El acceso a los eventos de navegación lo lograremos implementando en la viewmodel los métodos abstractos OnNavigatedFrom y OnNavigatedTo. Esto no permite guardar y recuperar parámetros o estados.

Definiendo Vistas. Utilizando PageBase

En la carpeta Views añadiremos nuestras vistas. Cada página será un objeto de tipo PageBase, tanto en XAML:

<base:PageBase
    x:Class="Navigation.Views.MainView"
    xmlns:local="using:Navigation"
    xmlns:base="using:Navigation.Views.Base"
    mc:Ignorable="d"
    DataContext="{Binding FirstViewModel, Source={StaticResource Locator}}">
    <Grid>
    </Grid>
</base:PageBase>

Como en el code-behind:

public sealed partial class MainView : PageBase
{
     public MainView()
     {
         this.InitializeComponent();
     }
}

La VistaModelo

Creamos una clase derivada de ViewModelBase:

public class FirstViewModel : ViewModelBase
{
 
}

Implementamos los métodos de navegación definidos en ViewModelBase:

public class FirstViewModel : ViewModelBase
{
    public override Task OnNavigatedFrom(NavigationEventArgs args)
    {
        return null;
    }
 
    public override Task OnNavigatedTo(NavigationEventArgs args)
    {
        return null;
    }
}

Asociando la Vista con la VistaModelo

Ahora, necesitamos conectar nuestra vista con nuestro viewmodel.
Podemos hacerlo de múltiples formas, desde el constructor de la vista,
instanciandola en App, usando Ioc. En nuestro caso, utilizaremos Ioc.
Usaremos Unity.

Una vez añadida la referencia correspondiente en cada proyecto (Windows y Windows Phone) creamos una nueva clase en la carpeta Base dentro de la carpeta ViewModels llamada ViewModelLocator:

public class ViewModelLocator
{
     readonly IUnityContainer _container;
 
     public ViewModelLocator()
     {
            _container = new UnityContainer();
 
            _container.RegisterType<MainViewModel>();
     }
 
     public MainViewModel MainViewModel
     {
            get { return _container.Resolve<MainViewModel>(); }
     }
}

Sencillamente registramos nuestras viewmodels y creamos un par de
propiedades públicas por cada viewmodel para poder resolverlas y acceder
a ellas desde las vistas. A continuación, registramos nuestro locator en App.xaml:

<locator:ViewModelLocator x:Key="Locator" />

Asignamos la viewmodel como DataContext de nuestra viewmodel:

DataContext="{Binding MainViewModel, Source={StaticResource Locator}}"

Y todo preparado!.

Hel10 World!

Vamos a añadir un botón a nuestra interfaz que al ser pulsado muestre un mensaje en pantalla.

Añadimos el botón en nuestra vista (MainView.xaml):

<Button            
     Content="Hel10 World"            
     Command="{Binding HelloCommand}"
     HorizontalAlignment="Center" />

Nuestro botón cuenta con un comando definido en la ViewModel:

private ICommand _helloCommand;
 
public ICommand HelloCommand
{
     get { return _helloCommand = _helloCommand ?? new DelegateCommand(HelloCommandExecute); }
}
 
private void HelloCommandExecute()
{
     // TODO:    
}

Al ejecutar el comando debemos mostrar el mensaje. De momento, no hemos añadido lógica. Utilizaremos para mostrar el mensaje un servicio.

Servicios

Introducimos el concepto de servicio. Básicamente serán clases que cubrirán un escenario muy específico. Por ejemplo:

  • Gestionar Tiles
  • Enviar un email
  • Llamar por teléfono
  • Mostrar un mensaje

En lugar de escribir el código específico para esas acciones directamente en la ViewModel, lo haremos en clases separadas, nuestros servicios. Las ViewModels interactuarán con estos servicios para poder realizar y gestionar las acciones necesarias.

Primero definiremos nuestro servicio de diálogo mediante una sencilla interfaz:

public interface IDialogService
{
     void Show(string message);
}

Realizamos la implementación de nuestro servicio:

public class DialogService : IDialogService
{
     public void Show(string message)
     {
    var messageDialog = new MessageDialog(message);
    var result = messageDialog.ShowAsync();
     }
}

Muy simple. Utilizamos el MessageDialog para mostrar el mensaje recibido como parámetro en nuestro servicio.

En el ViewModelLocator registramos el servicio:

_container.RegisterType<IDialogService, DialogService>(new ContainerControlledLifetimeManager());

Visto como crear el servicio y como registrarlo queda la duda de como se resuelve y utiliza en la ViewModel.
Bastará con declarar la interfaz de la clase como parámetro del
constructor público de la ViewModel. Registramos el servicio y la
ViewModel en nuestro contenedor de Unity, Unity lo resolverá
automáticamente. Cada servicio necesario en la ViewModel es “inyectado” con la implementación declarada en nuestro contenedor.

De esta forma conseguimos:

  • No tener que crear nuevas instancias de nuestro servicio cada vez que sea necesario.
  • Tener el código para una acción concreta en una única clase, sin repeticiones similares en múltiples ViewModels.
  • Tenemos la capacidad de modificar la implementación a “inyectar” en la ViewModel de un servicio con suma facilidad.
public MainViewModel(IDialogService dialogService)
{
     _dialogService = dialogService;
}

Modificamos la ejecución del comando utilizando nuestro servicio de diálogo:

private void HelloCommandExecute()
{
     _dialogService.Show("Hello World!");
}

Si ejecutamos la App veremos algo como lo siguiente:

Al pulsar el botón, se ejecutará el comando definido en la ViewModel
asignada como DataContext de la vista, que utilizará el servicio de
dialogo inyectado en el constructor para mostrar el dialogo:

Podéis descargar el ejemplo realizado a continuación:

También podéis acceder al código fuente directamente en GitHub:

Ver GitHub

Recordar que cualquier tipo de duda o sugerencia la podéis dejar en los comentarios de la entrada.

Más información

Nace SVQXDG, grupo de desarrolladores Xamarin en Sevilla

Introducción

No hay duda, los smartphones han llegado, y ya forman parte de la
vida de todos nosotros. En muchos aspectos de nuestra vida accedemos a
información, realizamos algna tarea o sencillamente nos entretenemos con
uno de ellos.

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 Phone

Esto a nivel de desarrollo nos supone
barreras. Contamos con 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 multiplataforma. Entre
las opciones disponibles, una de las más destacadas y en auge es Xamarin.

Xamarin permite el desarrollo de aplicaciones móviles nativas multiplataforma utilizando C#.
Además, poder compartir una gran cantidad de código, outilizar Visual
Studio como IDE lo convierte en una excelente opción para muchos
desarrolladores.

SVQXDG

En Sevilla, existen empresas y desarrolladores con un enorme talento
utilizando Xamarin para sus desarrollos de Apps móviles. Con este crisol
nace SVQXDG, o lo que es lo mismo, grupo de desarrolladores Xamarin de Sevilla. Es un grupo de usuario donde se buscará tener un punto habitual de reunión para ayudar, compartir y aprender entre todos.


Se ha creado un grupo en Meetup donde cualquier desarrollador podrá participar en discuciones, se organizarán actividades de grupo como quedadas donde poder charlar relajadamente sobre novedades, herramientas y otros aspectos relacionados además de por supuesto en eventos de comunidad principalmente presenciales aunque también online.

¿Te apuntas?

Más información

[Windows 10] Extensions SDK

Introducción

Desde la llegada de las Apps Universales ya con el SDK de Windows
Phone 8.1 se denotaba el esfuerzo por facilitar a los desarrolladores la
posibilidad de crear Apps para varias plataformas compartiendo la mayor
cantidad de código posible. Sin embargo, no debemos olvidar que la App
tiene como destino múltiples plataformas con características muy
diferentes.

¿Cómo se gestionan las características específicas de cada plataforma?

Antes de Windows 10

Con la llegada de las Apps Universales tuvimos una solución con tres
proyectos, uno específico para Windows, otro para Windows Phone y un
tercer proyecto llamado Shared donde añadir la mayor cantidad de código compartido posible. El resultado de la compilación eran dos binarios, uno por plataforma.

A nivel de desarrollo, a pesar del esfuerzo visible en la congergencia
entre plataformas, no todas las APIs estaban 100% compartidas.

Ante casos de APIs no compartidas o específicas de una plataforma teníamos múltiples opciones:

  • Colocar el código específico en cada proyecto de cada plataforma.
  • Utilizar directivas de compilación en clases compartidas.

Mediante directivas de compilación podemos elegir que parte del
código ejecutar dependiendo de la plataforma donde se ejecute. Se debe
utilizar sólo para pequeños trozos de código. Hay que tener en cuenta
que aunque logramos nuestro objetivo, en algunos casos estamos
duplicando código.

Con la llegada de Windows 10

Con la llegada del SDK de Windows 10 Preview tenemos la posibilidad de crear Apps Universales con un único binario
que funcione en múltiples plataformas. Tenemos acceso a una gran
cantidad de APIs totalmente compartidas pero… ¿que ocurre cuando
necesitamos acceder a APIs específicas de una plataforma?

La respuesta a la pregunta son los Extensions SDK. Por cada familia de dispositivo contamos con una serie de extensiones que nos permiten acceder a APIs específicas.

NOTA: Por ahora, en la versión disponible de las
herramientas de desarrollo para Windows 10 Technical Preview contamos
con extensiones para Desktop y Mobile.

Añadiendo extensiones

Para añadir una extensión correspondiente a una familia de
dispositivo hacemos clic derecho sobre las referencias del proyecto y
seleccionamos la opción Add Reference…

Accediendo al apartado Extensions dentro de Universal App Platform:

Tenemos disponible la extensión para Desktop y Mobile.

Trabajando con extensiones

Al trabajar con extensiones siempre debemos realizar verificaciones
de si la API específica de una familia de dispositivos con la que
deseamos trabajar esta disponible o no. Si no realizamos verificaciones y
la llamada a la API de una extensión se ejecuta en un dispositivo que
no soporta dicha extensión, obtendremos una excepción.

Vimos previamente como se gestionaba en Windows Phone 8.1 mediante
directivas de compilación la pulsación de la tecla volver. A
continuación, vamos a ver exactamente lo mismo utilizando Extensions SDK
en Windows 10.

Tras añadir la extensión Mobile:

En el constructor de la App en el archivo App.xaml.cs añadimos:

 HardwareButtons.BackPressed += HardwareButtons_BackPressed;

Con el evento asociado:

private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    //TODO:
}

Tan sencillo como esto pero si ejecutamos en Windows la App…

Como comentamos previamente debemos añadir verificaciones para asegurar que el dispositivo soporta la extensión o no:

if (ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons"))
     HardwareButtons.BackPressed += HardwareButtons_BackPressed;

Utilizamos el método IsTypePresent de la clase estática ApiInformation incluida dentro del namespace Windows.Foundation.Metadata.

NOTA: En la clase estática ApiInformation tenemos métodos para verificar no solo tipos, sino métodos, propiedades, contratos, etc.

La verificación se realiza con el nombre completo del tipo en una cadena.

NOTA: Sin duda no es quizás la manera más óptima
para realizar la comprobación. Recordad que estamos ante una versión
Preview de las herramientas.

Podéis descargar el  pequeño ejemplo realizado a continuación:

También podéis acceder al código fuente directamente en GitHub:

Ver GitHub

Recordar que cualquier tipo de duda o sugerencia la podéis dejar en los comentarios de la entrada.

Más información

[Windows 10] Control SplitView

El control SplitView

Algunos desarrolladores lo conocerán como side menu, otros como navigation drawer y otros como hamburguer menu.
En todas las plataformas móviles se ha utilizado en muchas Apps como
una solución de navegación. Consiste en un Menu deslizante que aparece
de uno de los laterales al pulsar un botón situado habitualmente en un
lateral en la parte superior. Con la llegada de Windows 10 nos llega un
nuevo patrón de diseño y navegación en las Apps:

Las herramientas de desarrollo de Windows 10 Technical Preview nos
aportan nuevas herramientas, emuladores, APIs y controles. Entre el
conjunto del controles nuevos disponibles cabe destacar el control SplitView. Este control es nos permite crear un menu deslizante lateral.

Anatomía del control

Antes de entrar de lleno, en el uso del control vamos a realizar un
análisis de la anatomía del mismo. El control SplitView cuenta con una
propiedad Pane que permite establecer el contenido del panel lateral. Podemos mostrar el panel a izquierda o derecha mediante la propiedad PanePlacement y el ancho utilizando OpenPaneLength.

El panel lateral puede estar expandido o no. Este comportamiento se gestiona con la propiedad IsPaneOpen. En la imagen superior el menu esta contraido. Al pulsar sobre el botón Hamburguer:

El menu se expande. La propiedad IsPaneOpen se modificará a
True. Podemos además modificar aspectos visuales como el color de fondo,
el color de fondo del panel o el ancho que tendrá el menu contraido.

En este artículo vamos a utilizar el control SplitView como
base estructural para la navegación de nuestra aplicación utilizando
buenas prácticas como el patrón MVVM, inyección de dependencias o el uso
de servicios.

Utilizando el control SplitView

Para probar las posibilidades del control SplitView crearemos un nuevo proyecto UAP:

Nuestro objetivo en este ejemplo será utilizar como base de la App el
control SplitView. Contaremos con un menu lateral von múltiples
opciones que nos permitirán acceder a distintos apartados de la App.

Comenzamos añadiendo el control SplitView en nuestra vista principal:

<SplitView>
</SplitView>

Modificamos el control utilizando sus propiedades básicas para adaptarlo a nuestras necesidades:

<SplitView x:Name="Splitter"
     DisplayMode="CompactInline"  
     Background="{StaticResource BackgroundBrush}"      
     PaneBackground="{StaticResource BackgroundPaneBrush}"       
     PanePlacement="Left"      
     CompactPaneLength="60"
     OpenPaneLength="240"    
     IsPaneOpen="{Binding IsPaneOpen}">
</SplitView>

Hemos utilizado las siguientes propiedades:

  • PanePlacement: Posición del Panel lateral. Tenemos dos posibles opciones, izquierda (Left) o derecha (Right).
  • PaneBackground: Color de fondo del Panel lateral.
  • OpenPaneLength: Ancho en píxeles del Panel abierto.
  • CompactPaneLength: Ancho en píxeles del Panel cerrado.
  • Background: Color de fondo.
  • IsPanelOpen: Propiedad de tipo bool que nos permite tanto saber como establecer si el Panel esta abierto no.

Otra de las propiedades fundamentales del control es DisplayMode.
Esta propiedad nos permite indicar el comportamiento del menu lateral
tanto abierto como cerrado. Tenemos cuatro opciones disponibles:

  • Inline: El panel cerrado no aparece mientras que abierto pasa a ocupar el ancho establecido en la propiedad OpenPaneLength, dejando que el contenido ocupe el resto del espacio disponible.
  • Overlay: El comportamiento es similar a Inline con
    la diferencia(importante) del modo abierto. En modo abierto el contenido
    ocupa todo el espacio, el Panel se posiciona por encima del contenido.
  • Compact Inline: El Panel abierto tiene el ancho establecido en la propiedad OpenPaneLength, dejando al contenido el resto del espacio. Al cerrar el Panel, pasa a ocupar el ancho establecido en la propiedad CompactPaneLength.
  • Compact Overlay: En este caso el Panel se posiciona por encima del contenido en modo abierto.

En la ViewModel de la vista tendremos una propiedad bindeada a la propiedad IsPaneOpen para poder gestionar el estado del menu:

private bool _isPaneOpen;
 
public bool IsPaneOpen
{
     get
     {
          return _isPaneOpen;
     }
     set
     {
      _isPaneOpen = value;
      RaisePropertyChanged();
     }
}

Pero… ¿cómo modificamos el estado del Panel?.

Necesitamos definir un ToggleButton para gestionar el estado
del Panel. El botón contará con dos estados para mostrar una apariencia
diferencia al usuario cuando el Panel este abierto o cerrado. Al
pulsarlo ejecutará un comando en la ViewModel que modificará la propiedad IsPaneOpen:

<ToggleButton                
     x:Name="HamburguerButton"                
     Style="{StaticResource SymbolButton}"                       
     Command="{Binding HamburgerCommand}"          
     VerticalAlignment="Top"            
     Foreground="White"          
     Margin="0,5,0,0">   
     <ToggleButton.Content>   
          <Border Background="Transparent"     
               Width="40"       
               Height="40">          
               <FontIcon x:Name="Hamburger"        
                    FontFamily="Segoe MDL2 Assets"          
                    Glyph="" />
          </Border>     
     </ToggleButton.Content>
</ToggleButton>

El comando a ejecutar:

private ICommand _hamburgerCommand;
 
public ICommand HamburgerCommand
{
     get { return _hamburgerCommand = _hamburgerCommand ?? new DelegateCommand(HamburgerCommandExecute); }
}
 
private void HamburgerCommandExecute()
{
     IsPaneOpen = (IsPaneOpen == true) ? false : true;
}

El contenido del Panel lateral lo definiremos dentro de la propiedad Pane:

<SplitView.Pane>
     <RelativePanel>
          <ListView
             ItemsSource="{Binding MenuItems}"
             SelectedItem="{Binding SelectedMenuItem, Mode=TwoWay}"
             ItemTemplate="{StaticResource MenuItemDataTemplate}"
             SelectionMode="Single"
             IsItemClickEnabled="False"
             Margin="0, 50, 0, 0" />
     </RelativePanel>
</SplitView.Pane>

En  nuestro ejemplo mostraremos un menu con varias opciones. Para ello, utilizaremos una lista de elementos MenuItem:

public class MenuItem
{
     public string Icon { get; set; }
     public string Title { get; set; }
     public Type View { get; set; }
}

Cada MenuItem (clase definida dentro de la carpeta Models) contará con
el icono y título a mostrar además del tipo de la vista a la que
navegará. Al entrar en la vista cargaremos nuestro listado de opciones:

private void LoadMenu()
{
     MenuItems = new ObservableCollection<MenuItem>
     {
         new MenuItem
         {
              Icon = "",
              Title = "Home",
              View = typeof(HomeView)
         },
         new MenuItem
         {
              Icon = "",
              Title = "Standings",
              View = typeof(StandingsView)
         },
         new MenuItem
         {
              Icon = "",
              Title = "About",
              View = typeof(AboutView)
         }
     };
 
     SelectedMenuItem = MenuItems.FirstOrDefault();
}

Además de cargar el listado, seleccionamos el MenuItem por
defecto, que será el primero. De todo lo anterior la parte más destacada
es el icono. Con la llegada de las herramientas de Windows 10 Technical
Preview, nos llega un nuevo tipo de fuente a utilizar en nuestras Apps,
Segoe MDL2 Assets:

NOTA: Podemos utilizar la herramienta Mapa de
carácteres para ver todos los iconos disponibles en la nueva fuente.
Para utilizar el icono en vuestras Apps bastará con copiar el icono
deseado.

Una vez establecido el elemento de Menu seleccionado, realizamos la navegación a la vista correspondiente:

public MenuItem SelectedMenuItem
{
    get { return _selectedMenuItem; }
    set
    {
        _selectedMenuItem = value;
        RaisePropertyChanged();
 
        Navigate(_selectedMenuItem.View);
    }
}

El Panel lateral del SplitView se mantendrá visible siempre modificando la vista que se muestra al cambiar el elemento seleccionado del panel.

¿Cómo gestionamos esto?

El Frame es el encargado de contener y gestionar cada una de las páginas (Page).Tenemos un Frame
creado durante el arranque de la App. Sin embargo, queremos gestionar
la navegación de páginas desde la página que contiene el SplitView.
Debemos crear otro frame dentro del control SplitView:

<Frame x:Name="SplitViewFrame"
       Margin="0, 10" />

Para gestionar correctamente la navegación desde nuestras ViewModels
debemos tener acceso al Frame. Todas nuestras páginas heredan de una PageBase donde estableceremos el Frame del SplitView:

private Frame _splitViewFrame;
 
public Frame SplitViewFrame
{
     get { return _splitViewFrame; }
     set
     {
          _splitViewFrame = value;
 
      if(_vm == null)
           _vm = (ViewModelBase)this.DataContext;
 
      _vm.SetSplitFrame(_splitViewFrame);
     }
}

Al establecer el Frame del SplitView en el PageBase se establecerá el mismo en una propiedad de tipo Frame de la ViewModelBase, clase de la que heredan todas nuestras ViewModels:

public Frame SplitViewFrame
{
     get { return splitViewFrame; }
}

De esta forma desde la ViewModel, de forma muy sencilla podemos gestionar la navegación:

private void Navigate(Type view)
{
    var type = view.Name;
 
    switch (type)
    {
        case "HomeView":
            SplitViewFrame.Navigate(view, _driverStanding);
            break;
        case "StandingsView":
            SplitViewFrame.Navigate(view, _driverStanding);
            break;
        case "AboutView":
            SplitViewFrame.Navigate(view);
            break;
    }
}
El resultado es el siguiente:
Al pulsar el botón Hamburguer, modificamos la propiedad IsPaneOpen de la ViewModel que modificará el estado del SplitView cerrándolo:

Pulsándo sobre cualquier elemento del Panel lateral provocará el
cambio del elemento seleccionado, se llamará al método Navigate de la ViewModel provocando la navegación en el Frame contenido dentro del SplitView.

Volver atrás

En las Apps Windows Phone contamos con el botón físico para navegar
atrás. En el caso de Apps Windows Store, gestionamos el botón volver en
pantalla.

¿Cómo gestionamos el botón volver en Apps UAP?

Añadimos en nuestra nuestra vista principal,
donde definimos el SplitView un nuevo elemento visual que nos permita
gestionar la navegación atrás:

<RadioButton
     x:Name="BackButton" 
     Command="{Binding BackCommand}"  
     Background="{StaticResource SystemControlBackgroundAccentBrush}"           
     Width="240"               
     Margin="0, 50, 0, 0">                  
     <RadioButton.Tag>                      
          <TextBlock Text=""                   
                     FontFamily="Segoe MDL2 Assets"                               
                     VerticalAlignment="Center"               
                     HorizontalAlignment="Left"                
                     Margin="24, 0, 0 ,0" />                     
     </RadioButton.Tag>     
</RadioButton>

Utilizamos la nueva fuente Segoe MDL2 Assets para mostrar una flecha hacia atrás y vinculamos con un comando llamado BackCommand definido en la ViewModel:

private DelegateCommand _backCommand;
 
public ICommand NavigateCommand
{            
     get { return _navigateCommand = _navigateCommand ?? new DelegateCommand<MenuItem>(NavigateCommandExecute); }
}
 
private void BackCommandExecute()
{
     SplitViewFrame.GoBack();
     var selectedMenuItem = SplitViewFrame.CurrentSourcePageType;
     SelectedMenuItem = MenuItems.FirstOrDefault(mi => mi.View.Equals(selectedMenuItem));
}    
 
private bool BackCommandCanExecute()
{
     return SplitViewFrame.CanGoBack;
}

Se verifica si hay elementos en la colección de páginas y podemos
navegar hacia atrás para habilitar el botón. En caso de poner navegar,
se realiza la navegación atrás (GoBack) además de seleccionar el elemento correspondiente del menu lateral.

El resultado:

Este nuevo control utilizado junto a otras novedades como los
Adaptive Triggers o el nuevo Panel RelativePanel nos permitirá definir
interfaces de usuario que se adapten ante cualquier tamaño de pantalla y
dispositivo:

<VisualStateManager.VisualStateGroups>
     <VisualStateGroup>      
          <VisualState x:Name="wideState">                   
               <VisualState.StateTriggers>     
                    <AdaptiveTrigger MinWindowWidth="641" />
               </VisualState.StateTriggers>      
               <VisualState.Setters>         
                    <Setter Target="Splitter.DisplayMode" Value="CompactInline"/>
               </VisualState.Setters>
          </VisualState>              
          <VisualState x:Name="narrowState">            
               <VisualState.StateTriggers>    
                    <AdaptiveTrigger MinWindowWidth="0" />
               </VisualState.StateTriggers>
               <VisualState.Setters>
                    <Setter Target="Splitter.DisplayMode" Value="Overlay"/>
               </VisualState.Setters>
          </VisualState>
     </VisualStateGroup>    
</VisualStateManager.VisualStateGroups>

Podemos modificar el modo del SplitView segun el tamaño de la ventana.
Si reducimos el tamaño, podemos ocultar el menu lateral para aprovechar
mejor el espacio:

De igual forma, podemos modificar la posición de los elementos entre sí segun ciertas condiciones.

El resultado final lo podéis ver directamente:

Podéis descargar el ejemplo realizado a continuación:

También podéis acceder al código fuente directamente en GitHub:

Ver GitHub

Recordar que cualquier tipo de duda o sugerencia la podéis dejar en los comentarios de la entrada.

Más información

[Tips and Tricks] Creando vistas específicas por dispositivo en Apps Windows 10

Introducción

Con la llegada del SDK de Windows 10 Preview tenemos la posibilidad de crear Apps Universales con un único binario
que funcione en múltiples plataformas. Es un paso importante pero que
conlleva realizar una acción que sera comun, diferenciar entre las
diferentes plataformas donde correrá dicho binario para poder adaptar la
interfaz de usuario. Con ese objetivo utilizamos entre otras opciones
los Adaptive Triggers de los que ya hemos hablado.

Sin embargo, en ocasiones la misma vista en disferentes dispositivos puede que sea totalmente diferente.

¿Que hacer ante estas situaciones?

Creando vistas específicas por dispositivo

Podemos utilizar Adaptive Triggers para adaptar la interfaz o en caso
de ser más simple tener dos vistas en dos ficheros diferentes, podemos
hacerlo.

Crearemos un nuevo proyecto UAP:

Por defecto, se nos añade una vista llamada MainPage:

<Page
    x:Class="DeviceFamily_View.MainPage"
    xmlns:local="using:DeviceFamily_View"
    mc:Ignorable="d">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    </Grid>
</Page>

Añadimos un texto específico a mostrar en Windows junto a un botón:

<StackPanel         
     HorizontalAlignment="Center"  
     VerticalAlignment="Center">
     <TextBlock
          Text="Windows"
          FontSize="48" />
     <Button
          Content="Botón" />
</StackPanel>

Si ejecutamos la App veremos algo como lo siguiente:

Veremos exactamente lo mismo ejecutando la App en Windows Phone.

¿Y si deseamos tener la misma vista específica para Windows Phone?

Creamos una carpeta siguiente la siguiente nomenclatura:

  • DeviceFamily-[Family]

Donde Family es la familia del dispotivo para el que
deseamos sobrescribir la vista. En nuestro ejemplo, creamos una carpeta
llamada DeviceFamily-Mobile.

Una vez creada la carpeta, vamos a añadir una vista XAML en la misma.
Clic derecho sobre la misma y elegimos la opción “Añadir nuevo
elemento”:

Añadimos la sobreescritura de la vista MainPage. Es importante un
detalle del fichero añadido, no añadimos code behind. Esta vista
utilizará el mismo code behind que la que teníamos previamente.

Añadimos el contenido de la vista específica para Windows Phone:

<StackPanel         
     HorizontalAlignment="Center"  
     VerticalAlignment="Center">
     <TextBlock
          Text="Windows Phone"
          FontSize="48" />
     <Button
          Content="Botón"
          Click="Button_Click"/>
</StackPanel>

Esta vista es específica para Windows Phone. En este momento al ejecutar
en Windows se mostrará la vista creada con el proyecto, mientras que si
ejecutamos en Windows Phone se mostrará la vista de la carpeta DeviceFamily-Mobile. El code behind, como comentamos es compartido. Si añadimos por ejemplo el evento clic del botón:

private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
     Debug.WriteLine("Lógica compartida!");
}

NOTA: Normalmente para lanzar la acción de un
botón al ser pulsado utilizaremos un comando en la ViewModel asociada
con DataContext de la vista.

Tendremos la lógica compartida en un mismo fichero.

NOTA: Recordad que estamos ante una versión
Preview de las herramientas de desarrollo. La versión final puede variar
con respecto al comportamiento actual.

Podéis descargar el ejemplo realizado a continuación:

También podéis acceder al código fuente directamente en GitHub:

Ver GitHub

De esta forma podemos sobreescribir vistas por completo para tener
vistas específicas por familia de dispositivos. Recordar que cualquier
tipo de duda o sugerencia la podéis dejar en los comentarios de la
entrada.

Más información

[Quedada CartujaDotNet] Preparando próximos eventos

logo-cartuja-net_4Quedada

En CartujaDotNet
vamos a realizar una quedada informal para charlar abiertamente sobre
tecnologías Microsoft, herramientas utilizadas, intercambiar
impresiones, etc. Además, se analizarán las próximas charlas ya
planteadas y los eventos confirmados entre otros temas de interés.

No hace falta confirmar asistencia, y por supuesto será gratuito.

¿Te apuntas?

A continuación tienes disponible la fecha, hora y lugar:

Quedada CartujaDotNet
Bar Quinoa

Más información

[Evento CartujaDotNet] Introducción al desarrollo de Apps Windows 10

El evento

El pasado 23 de Marzo, Microsoft liberaba dentro del programa de
Windows Insider una Preview de las herramientas de desarrollo de Windows 10. Con la llegada de las nuevas herramientas tenemos la posibilidad de crear Apps Universales con un único binario que funcione en múltiples plataformas además de contar con nuevas APIs, controles y herramientas.

Ante tanta novedad, desde CartujaDotNet se organiza un evento para analizar los cambios principales.

¿Te apuntas?

Fecha

El evento tendrá lugar el próximo Jueves, 23 de Abril de 19:00h a 21:00h. Tendremos una sesión de 2 horas de duración.

Lugar

Tendrá lugar en el Cloud Pointing de Sevilla situado en el Parque Empresarial Nuevo Torneo. Tenéis la información exacta del lugar a continuación:

c Biología, 12, Edificio Vilamar 2, 3ª Planta
Parque Empresarial Nuevo Torneo
41015 Sevilla

Agenda y Ponentes

Introducción al desarrollo de Apps Universales Windows 10 (Javier Suárez & Josué Yeray) (120 minutos)

En esta sesión contaremos con Javier Suárez y Josué
Yeray, Windows Platform Development MVPs, que nos contarán las
principales novedades en desarrollo de Apps Universales en Windows 10.
Veremos las nuevas plantillas y herramientas disponibles para hacer
Apps, las bases de UAP viendo el SDK de extensiones además de analizar
técnicas para crear interfaces adaptativas a cualquier dispositivo
utilizando nuevos controles como el panel RelativePanel, el SplitView o con las novedades en estados visuales, los Adaptive Triggers.

Más información