Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=f40865be-aa36-4166-b679-ea473f0314fa

Creando aplicaciones Linux con Xamarin y Xamarin.Forms

Icono de advertencia ATENCIÓN: este contenido tiene más de 2 años de antigüedad y, debido a su temática, podría contener información desactualizada o inexacta en la actualidad.

Seguro que pensabas que Xamarin es una plataforma que está orientada exclusivamente a crear aplicaciones móviles. Aunque Xamarin nació con esta orientación, en realidad es una plataforma generalista que permite crear aplicaciones para todo tipo de sistemas y dispositivos, aunque de momento se ha centrado sobre todo en el desarrollo móvil.

Por ejemplo, el soporte de Linux en Xamarin.Forms ahora mismo se encuentra en modo Preview, y está basado en un nuevo backend basado en Gtk#.

Gtk# es un toolkit de interfaz gráfica de usuario para Mono y .Net. El proyecto enlaza el kit de herramientas gtk+ y una variedad de bibliotecas de GNOME, lo que permite el desarrollo de aplicaciones gráficas GNOME nativas utilizando estas plataformas de desarrollo.

Nota: este nuevo backend permite crear aplicaciones Linux, pero también aplicaciones para macOS y Windows. Hoy nos centraremos en Linux.

Puedes descargar la última versión de Gtk# desde la página de descargas del proyecto Mono.

Configurando un proyecto Linux

Desarrollar para Linux es posible desde Linux, macOS y Windows utilizando MonoDevelop, Visual Studio para macOS y Visual Studio, respectivamente.

MonoDevelop es un entorno de desarrollo de código abierto disponible para Linux, aunque también para Windows y macOS, pero en estos tenemos mejores opciones.

Aspecto de MonoDevelop

Para compilar bibliotecas portables desde MonoDevelop, es necesario utilizar el siguiente comando:

sudo apt-get install referenceassemblies-pcl

Para crear un nuevo proyecto de tipo biblioteca .NET en MonoDevelop, se debe elegir la opción una Biblioteca de clases.

Crear librería desde MonoDevelop

Agregar una biblioteca .NET desde Windows

Hasta que las plantillas de Xamarin.Forms agreguen un proyecto de aplicación Linux, podemos crearlo fácilmente por nuestra cuenta. Para hacerlo de manera sencilla, en Visual Studio para Windows agregamos un nuevo proyecto a la solución y elegimos una Biblioteca de clases:

Librería

Y desde macOS

Para crear un nuevo proyecto de biblioteca .NET en Visual Studio para macOS, agregamos un nuevo proyecto a la solución y elegimos una Biblioteca de clases:

Crear librería desde Visual Studio macOS

Configurar el proyecto

Lo primero que tenemos que hacer para trabajar con el backend Gtk es precisamente agregar al proyecto recién creado las referencias a las bibliotecas Gtk#:

Añadir referencias

También necesitaremos agregar el último paquete Xamarin.Forms.Platform.GTK.

Editamos de este modo la clase creada junto con la biblioteca:

public class Program
{
        [STAThread]
        static void Main(string[] args)
        {
            Gtk.Application.Init();
            Forms.Init();
            var app = new App();
            var window = new FormsWindow();
            window.LoadApplication(app);
            window.SetApplicationTitle("WeatherApp");
            window.Show();
            Gtk.Application.Run();
        } 
}

que inicializa Xamarin.Forms, crea una ventana y carga la aplicación Forms.

Nota: en caso de necesitar inicializar otras dependencias, este es el lugar.

¡A probar!

Con el proyecto del backend Gtk como proyecto de inicio, lo ejecutamos (F5). ¡Voilà! ¡Ahora tienes una aplicación Gtk nativa!.

Una app de Xamarin Forms ejecutándose en Linux

¿Algo más?

Ahora que tienes una aplicación, es hora de ponerse la gorra de diseñador de UX y comenzar a explorar los cambios necesarios para adaptar la aplicación a esta nueva plataforma.

Estilos

Échale un vistazo al estilo de la interfaz de usuario para Linux. Es posible que el mismo estilo utilizado en los dispositivos móviles no se vea bien. ¡Esto lo modificamos fácilmente!.

Con los cambios recientes realizados en OnPlatform, ahora se puede seleccionar fácilmente cada plataforma. Eso incluye a GTK.

  • Desde XAML:
<Button.TextColor>
     <OnPlatform x:TypeArguments="Color">
           <On Platform="iOS" Value="White"/>
           <On Platform="GTK" Value="White"/>
           <On Platform="Android" Value="Black"/>
     </OnPlatform>
</Button.TextColor>
  • O desde C#:
if (Device.RuntimePlatform == Device.GTK)
     return "Images/image.jpg";
else if (Device.RuntimePlatform == Device.UWP)
     return "Assets/image.jpg";
else
     return "image.jpg";

Temas Gtk#

Hay una gran variedad de temas disponibles para GTK. ¡Se pueden usar desde la aplicación Xamarin.Forms!

GtkThemes.Init();
GtkThemes.LoadCustomTheme("Themes/gtkrc");

Nombre e icono de la aplicación

Para representar la imagen de la aplicación, es importante establecer su título e icono.

window.SetApplicationTitle("WeatherApp");
window.SetApplicationIcon("icon.png")

Forms Embedding

La posibilidad de tomar cualquier ContentPage y usarlo en aplicaciones nativas, ¡también está disponible en el backend de Gtk!

var settingsView = new SettingsView().CreateContainer();
vbox.PackEnd(settingsView, true, true, 0);

Proyecto de ejemplo

Te dejo un proyecto que he creado con esta tecnología. Se trata de Movies (ZIP, 577KB), una aplicación para Linux y otras plataformas que hace uso de GTK# y de la API de The Movie Database para demostrar las posibilidades de este backend de Xamarin.

Imagen de la aplicación

Funciona en Android, iOS, Linux, Windows y como aplicación de Universal Windows Platform.

DEMO Time!

En el siguiente vídeo os muestro el funcionamiento de la aplicación anterior y entro en los detalles mínimos para ponerlo a funcionar y sobre su funcionamiento:

¿Ya sabías que Xamarin servía también para hacer esto y no solo para desarrollo móvil? ¿Te parece interesante esta tecnología? Déjanos tus comentarios.

Fecha de publicación:
Javier Suárez Ruiz Javier Suárez es desarrollador con años de experiencia en tecnologías .NET. Está especializado en el desarrollo de aplicaciones móviles. MVP de Microsoft y de Xamarin y un gran apasionado de la comunidad donde participa activamente coordinando varios grupos de usuarios e impartiendo charlas.
Apasionado por lograr aprender algo nuevo cada día. Puedes seguirlo en Twitter en @jsuarezruiz o leer sus blog técnico personal. Ver todos los posts de Javier Suárez Ruiz
Archivado en: Lenguajes y plataformas

¿Te ha gustado este post?
Pues espera a ver nuestro boletín mensual...

Suscríbete a la newsletter

La mejor formación online para desarrolladores como tú

Comentarios (7) -

José Luis Ríos Olayo
José Luis Ríos Olayo

Me interesa mucho el tema.
Mi pregunta seria ¿Es muy difícil aprender GTK , entiendo XAML y C#? Es decir tendria que aprender un nuevo lenguaje.

Responder

Javier Suárez
Javier Suárez

Hola José Luis. Xamarin.Forms para Linux hace uso de GTK# para la definición de la interfaz de usuario. Si sabes XAML y C#, tendrás que aprender conceptos básicos como el sistema de Layouts o navegación en Forms pero lo tienes "a mano".
Si te refieres a aprender GTK# directamente. GTK# es un Toolkit de UI basado en GTK+ utilizando Mono y .NET. No es complejo comenzar. Te recomendaría empezar por: https://www.mono-project.com/docs/gui/gtksharp/ y por https://developer.gnome.org/gtk2/stable/
Hay claras diferencias con Xamarin.Forms, de entrada definirás la UI en C# o utilizando Glade: https://glade.gnome.org (disponible en MonoDevelop). También hay diferencias en Layouts, gestión de ventanas, etc. Tendrías que aprender conceptos nuevos, pero no un nuevo lenguaje (seguirías usando C#).
En el caso de GTK# diría que lo más complejo es encontrar dudas específicas (el nivel de documentación sobretodo en el caso de GTK# es menor a Xamarin.Forms).

Espero que sea de ayuda.

Un saludo.

Responder

José Luis Ríos Olayo
José Luis Ríos Olayo

Muchas gracias por la información, suena muy interesante y creo que si vale la pena profundizar un poco mas sobre el tema.
Espero ver más artículos como estos.
gracias y saludos.

Responder

Carlos Pichardo
Carlos Pichardo

Hola Javier, esto parece interesante sobre todo para utilizar las nuevas mini pc con linux, pero mi pregunta es tenemos acceso a los perifericos con mono? ejemplo usar los gpio de una Raspberry Pi o los puertos seriales?
Cordiales saludos,
Carlos Pichardo

Responder

Esta genial el post, te pregunto ¿es posible hacer aplicaciones tipo TPV con Xamarin forms? o mejor dicho ¿recomendarías esta herramienta para este tipo de sistemas?

Responder

:)   Me quedo con GTK+Python en lo que a GNU se refiere, Mono, Xamarin y relativos tienen los días contados en la plataforma del pingüino.

Es que las tecnologías de M$ a pesar de tener buenas herramientas, también tienen buenos agujeros de seguridad.

Responder

estoy en total desacuerdo y no por tonterías de la temeraria, backdoors, privacidad etc.
sino que creo que Microsoft esta sacando mucho provecho del software libre pero no aporta absolutamente nada a el.
Si ves esto es compatible con Linux solo por el hecho de que las librerías GTK que se usan en UNIX y MacOS que es su derivado también se utilizan en Linux, no porque el proyecto xamarin, mono y los de Microsoft o Google hayan realizado aporte sustanciales a linux  sino que Linux es prácticamente una copia de UNIX más no es UNIX a nivel de implementación una función puede ser invocada de la misma forma y obtener los mismos resultados e inclusive la misma presentación eso no quiere decir que su implementación sea idéntica.
A mi me Gustaría que el software libre se dedique a mejorar el lenguaje C potenciándolo a tal nivel que se equipare a C++ en sus ultimas especificaciones como la 20. es decir crear librerías que den soporte a la programación orientada a objetos en el lenguaje procedimental C. Luego crear entorno de desarrollos menos complicados con clases forms para crear GUI'S que faciliten el desarrollo así como lo hace Java, VB, C# pero un lenguaje y un entorno libre, potente y multiplataforma.
  Pero Linux es un desastre, esto se debe al ego de los desarrolladores. El que sabe no enseña ese celo intelectual que se llevan a la tumba y el que quiere aprender se pasa toda la vida para llegar a donde ellos llegaron entonces como avanzar y peor aun esos ciegos que creen que Linux es una maravilla, que no le falta nada. ya todo esta hecho y que todo se resuelve desde una terminal y no hay necesidad de implementar eso a nivel de interfaces visuales o GUI. Ese pensamiento tan errático y mezquino. no toman en cuenta al usuario final cuando reporta un comportamiento extraño del S.O o cuando les dice que implementen una característica común en otros SO del cual carece. No terminan de curar un Fork cuando se pelean y se separan y desarrolladores pasa a trabajar en otro Fork existen miles de ellos ninguno competente para el escritorio de un usuario común es decir ninguno cumplirá las expectativas  de un usuario de MacOS o Windows siempre carece de algo.
Mientras tanto Microsoft mejora sus tecnología basándose e integrando el software libre a tal punto que apps de MacOS  y Android  ya funcionan en Windows. Microsoft "Apoyando" a proyectos que solo los beneficia en contra del mismo software libre del cual saca provecho, llevándose el capital humano del software libre a su monopolio "Apoyando  con dinero al software lbre" es simplemente para desarrollar y probar sus productos y comprar influencia que sólo llevan  a crear discordia entre la comunidad del software libre.
EJEMPLO CLARO:
en Linux Mint he reportado un error a los que atienden a la comunidad desde la versión 7 y vienen arrastrando el error en la versión 20.3 la cual utilizo y sin duda en las posteriores. es estúpido a estas alturas estar diciendo esto.

1) IMPOSIBLE LOGEARSE EN UBUNTU, LINUX MINT Y DERIVADOS:
el archivo .xauthority se modifica sólo impidiendo autenticarse en el sistema operativo.

2) RENOMBRAR ARCHIVOS AL PASARLOS  DE UNOS DIRECTORIO A OTRO:
cuando pasas un lote de archivos recuperados que buscas por su extension a un directorio existen archivos diferentes con el mismo nombre ubicado en diferentes directorios y al trarar de pasarlos de forma ordenada a un directorio el sistema operativo no lo hace, de hecho te saca una GUI dando tres opciones "renombrar", "reemplazar o sobrescribir", "omitir archivo". obviamente no  deseo perder el archivo presiono renombrar y la GUI pierde el botón de renombrar y no renombra el archivo y mucho peor cuando tildas el check para que ejecute la misma acción sobre otros archivos  se pierde el botón de la GUI y no lo hace. Mi solución ha sido omitir dicha transferencia a ese directorio y crear otro directorio y en fin cientos de directorios  para alojar unos pocos archivos cuando deseo tenerlos todos en un solo directorio.
es tan difícil un código que renombre un grupo de archivos foto.jpg, foto.jpg, foto.jpg, foto.jpg, foto.jpg, que copie el primero al directorio luego te advierta que ya existe y los pase al directorio como foto(1).jpg, foto(2).jpg, foto(3).jpg, ... foto(n).jpg, al presionar renombrar o rename.

2) RENOMBRAR ARCHIVOS DE UNA SELECCIÓN:
Aveces tenemos fotos diferentes pero relacionadas a un acontecimiento ejemplo el 7mo cumpleaños de mi pequeña stefania.
y tienen nombres extraños y están desordenadas por lo que las selecciono para colocar un nombre. y desaparece la opción de renombrar la solución es renombrar foto por foto y si son 700 debo hacer ese proceso 700 veces.
es tan difícil un código que renombre un grupo de archivos w.jpg, x.jpg, y.jpg, z.jpg, fiesta.jpg, que al tomar la seleccion exista la opcion de renombrar y pida un nombre y en base a este cree un array con el nombre y lo apliqu sobre la seleccion de archivos fiesta7stefania(1).jpg, fiesta7stefania(2).jpg, fiesta7stefania(3).jpg, ... fiesta7stefania(n).jpg.
Es tan tonto esto que se asemeja al problema anterior y se resuelve con parte del mismo código del problema anterior
la solución de ellos es una desastre de aplicación que no cumple con dicha necesidad por no decir una cagada poco intuitiva  y es un requisito que resuelven otros sistemas operativos no es un simple antojo mio es algo común en la actualidad.

mejor no escribo más los terminare mas que aburriendo deprimiendo respecto a linux.
Si alguien es desarrollador de Ubuntu o linux mint simplemente escríbame a mi correo [email protected] y compartiré con todo gusto los problemas que he evidenciado en dicho sistema operativo en pro de su mejoría.

el Linux como sistema operativo en si mismo es muy estable y hace un buen uso de los recursos como memoria.
Lo único que funciona bien en Linux son los servicios lease servidores WEB, PROXY, DNS, SQL, PHP, LDAP . El acceso a internet es super rápido comparado a Windows, la productividad al trabajar y abrir varias aplicaciones e intercambiar entre escritorios.
pero todo esto se ve mermado o enlodado al toparte de que carece de cosas comunes en otros sistemas operativos como las descritas previamente y lo que ganabas con fluidez y velocidad en las aplicaciones lo ves mermado al perder tiempo intentando  hacer algo comun y que simplemente no se pueda, es triste.
amo la estabilidad en los browsers en linux y ni hablar de firefox puedes abrir 300 pestañas al mismo tiempo si te da la gana con un pc de pocos recursos ejemplo 1.5gb de memoria x32 bits o 700 pestañas en uno con 4gb ram y un procesador intel i5 de cuarta generación y ni hablar de equipos actuales con procesadores amd Ryzen.

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.