👆👆👆 Suscríbete a nuestro podcast. Y mejor aún, a nuestro boletín mensual: todo cosas útiles que no encontrarás en otro lado, una vez al mes.
📺 También puedes ver este post en vídeo en nuestro canal de YouTube. ¡Suscríbete si no lo has hecho ya!
Cuando apareció .NET allá por febrero de 2002, hace más de 20 años, las opciones para crear interfaces de usuario de escritorio eran mínimas. Básicamente estaba Windows Forms, que permitía diseñar aplicaciones de forma rápida para Windows.
Hoy en día existen una gran variedad de frameworks de interfaz de usuario, de la propia Microsoft, que podemos elegir a la hora de crear aplicaciones de escritorio: WPF, UWP, WinUI, .NET MAUI y por supuesto Windows Forms, que sigue vivito y coleando. Además existen frameworks que no son de Microsoft y que también son muy potentes.
Cada una de estas opciones tiene sus ventajas, sus inconvenientes y sus casos de uso ideales. Decidir cuál utilizar para tu próximo proyecto se ha vuelto una tarea complicada. Hoy le voy a dar un repaso a todas estas opciones para que las conozcas y puedas decidir.
Windows Forms
Como ya he dicho, en 2002, cuando apareció la versión 1.0 final de .NET farmework, la opción que ofrecía la plataforma para crear interfaces de usuario nativas era Windows Forms. Se trataba de sustituir al queridísimo Visual Basic que dominaba el mercado hasta entonces. Era una selección de opciones muy limitada (¡solo una!) pero también era maravilloso: no tenías que complicarte la vida.
Windows Forms era muy sencillo: arrastrar y soltar controles para diseñar formularios, se podían enlazar a datos y responder a los eventos de la interfaz. Potente, sencillo y rápido. Pero solamente servía para crear interfaces para Windows. En realidad, toda la plataforma .NET en aquel entonces servía exclusivamente para Windows, hasta que salió .NET Core en verano de 2016.
De hecho, estoy cometiendo un error al hablarte de Windows Forms en pasado. Quizá no lo sepas, pero WinForms todavía está en desarrollo activo, se ha incluido dentro de la versión moderna de .NET, y siguen trabajando mucho en ella, añadiéndole capacidades en cada gran actualización. Además es compatible hacia atrás con .NET framework, esa versión clásica de .NET con la que empezó, por lo que si tienes programas hechos hace 20 años con esto puedes seguir utilizándolos y ampliándolos.
Pero sus dos principales problemas son:
- Que las aplicaciones WinForms solo funcionan en Windows, ya que está totalmente atado a su API nativa.
- Su aspecto es bastante anticuado para los estándares actuales. Ya cuando salió el aspecto de los controles nativos de Windows empezaba a parecer algo "viejuno". Las apps demandaban más y los desarrolladores buscaban una flexibilidad parecida a la que daba HTML en la Web, pero sin sus limitaciones.
Por estos motivos, es una tecnología útil para mantener aplicaciones antiguas, para crear aplicaciones orientadas a datos (de tipo "gestión") o para aplicaciones internas que solo vayan a trabajar en Windows. Pero para crear aplicaciones nuevas, que además quieres que tengan un aspecto muy moderno y funcionen en otras plataformas, no es lo más indicado.
WPF
Así que, cuatro años después, en 2006, Microsoft lanzó Windows Presentation Foundation (WPF) junto a .NET 3.0, que incluía algunos otros subframeworks especializados como los ya desaparecidos Windows Communication foundation y Windows Workflow Foundation, de los que, por cierto, editamos sendos libros en su día en campusMVP.
Con WPF aparecían los archivos XAML (quédate con este nombre, porque es importante), que permiten crear UIs más ricas y complejas definiéndolas a partir de archivos XML, de forma muy parecida a lo que se hace con HTML en las páginas Web. Aunque también permiten definir las UIs mediante código.
Aunque tenía una curva de aprendizaje bastante elevada, WPF pronto se convirtió en la opción preferida para aplicaciones empresariales de escritorio, sobre todo porque Microsoft hizo un esfuerzo enorme de márketing y comunicación para lograrlo.
WPF también estaba detrás del malogrado Silverlight para la web, del que ya hablé cuando te conté la interesante historia de JavaScript.
Con MVVM (Modelo-Vista VistaModelo) y otros patrones de separación de código, WPF era además una opción más limpia y escalable que WinForms para crear aplicaciones de escritorio modernas.
WPF es una tecnología madura con muchos usuarios y una gran cantidad de recursos disponibles. Esto significa que puedes encontrar una gran cantidad de documentación, tutoriales y bibliotecas para ayudarte en tu desarrollo.
De hecho, igual que WinForms, WPF todavía se mantiene y se ejecuta en la última versión de .NET.
Por todo ello, WPF todavía puede ser una opción válida para crear proyectos nuevos que necesitan características avanzadas de interfaz de usuario, escapando de los controles nativos.
Pero es importante que sepas que también está limitado a ejecutarse únicamente en Windows.
Además, como veremos enseguida, existen opciones más modernas y multiplataforma que debes considerar.
UWP, Plataforma Universal de Windows
La siguiente evolución de todo esto apareció con Windows 8, en 2012. Este nuevo sistema operativo necesitaba aplicaciones a pantalla completa para funcionar en tabletas y dispositivos táctiles. Esto se intentó con el lenguaje de diseño "Metro" (que incluía las famosas baldositas, que algunos todavía echamos de menos) y las nuevas aplicaciones, basadas también en WPF, y que se llamaron "Apps Modernas", en un alarde de originalidad. Más tarde, ya con Windows 10, la rebautizaron como Universal Windows Apps o UWP.
En la práctica no terminó de cuajar. Y era una tecnología que seguía atada a Windows. No fue hasta Windows 10, en 2015 cuando UWP ofreció realmente la posibilidad de crear unas aplicaciones nativas que se ejecutaran en PCs, móviles, tablets, Xbox y en otros dispositivos como los desaparecidos Microsoft Surface y las gafas HoloLens. Aunque solamente en dispositivos que soportasen Windows 10 o alguna de sus variantes (sí, igual eres muy joven para recordarlo 😉 pero hubo móviles con una versión reducida de Windows 10 llamada Windows Mobile).
Como digo, UWP se basa en WPF y permite el desarrollo de aplicaciones adaptativas que pueden ajustarse dinámicamente a diferentes dispositivos y tamaños de pantalla. Ah, y una cuestión muy distintiva que añadió en su día fue el aislamiento de recursos, que hacía que las aplicaciones fuesen más seguras, aunque también les limita el acceso a ciertos recursos por cuestiones de seguridad.
Otro detalle importante a tener en cuenta es que estas aplicaciones están pensadas para distribuirse a través de la Microsoft Store, por lo que la instalación es sencilla pero debes pasar por el aro de Microsoft si quieres distribuirlas.
No están soportadas por las últimas versiones de .NET.
Hoy por hoy no te recomendaría crear nuevas aplicaciones con esto, porque además, por supuesto, Microsoft sacó algo nuevo y mejor poco después...
WinUI
Durante los siguientes años, Microsoft fue depurando y evolucionando la tecnología UWP. A esta evolución le llamó en otro alarde de originalidad, WinUI.
Para complicar un poquito más las cosas existen dos versiones de WinUI activas y soportadas que se pueden usar, la 2 y la 3.
WinUI 2 es realmente una biblioteca de extensiones en UWP que contiene controles y estilos que coinciden con el lenguaje de diseño de Windows 11. Se distribuye como un paquete NuGet y funciona por encima del XAML de UWP, que es quien de verdad renderiza los controles de la interfaz.
WinUI 3 apareció a finales de 2021 junto con Windows 11, y se considera el framework de interfaz de usuario más moderno y nativo para Windows. Ya no va ligado a UWP (forma parte del SDK de Windows).
WinUI 3 desacopla del sistema operativo el XAML con el que defines la interfaz. Gracias a eso, es un paquete independiente que puede actualizarse rápidamente sin tener que actualizar Windows. Esto también permite que si se lanzan nuevas características puedan funcionar en versiones anteriores de Windows 10 y 11, aunque no estén actualizadas a la última, algo muy habitual por otra parte.
Además, WinUI 3 es compatible con el control WebView2, basado en Chromium. Es decir, que es capaz de albergar páginas Web e interaccionar con ellas. Algo que, todo sea dicho, también tiene Windows Forms.
De todo esto te hablamos en su día en una entrevista con el que era por aquel entonces el responsable técnico de esta tecnología en Microsoft, Miguel Ramos: De Win32 a WinUI 3: la evolución de las APIs de UI en Windows, con Miguel Ramos de Microsoft.
Te dejo también un enlace que compara con detalle las dos versiones de WinUI.
Si lo comparamos con Windows Forms o con WPF, WinUI 3 es la implementación de interfaz de usuario más moderna y que admite más tipos de entrada (táctil, lápiz, voz...).
Eso sí, como su propio nombre indica, WinUI solamente sirve para crear aplicaciones para Windows, en sus versiones 10 y 11.
WinUI 3 sería la opción más recomendable si quieres crear aplicaciones de escritorio nativas para versiones modernas de Windows, con una interfaz moderna (con aspecto Fluent de Windows 11), y que además permita interoperar a bajo nivel con el sistema mediante las APIs nativas.
Si te interesa crear aplicaciones multiplataforma con .NET tenemos que ver todavía otras opciones.
.NET MAUI y desarrollo multiplataforma de interfaces
En el año 2016 Microsoft compró Xamarin. La empresa tenía un framework de interfaz de usuario llamado Xamarin Forms, que estaba también basado en la sintaxis XAML y permitía crear aplicaciones para iPhone y Android (y algunos dispositivos "rarunos" más, como smartwatches y televisiones), con la característica de que la diseñabas una vez y funcionaba en todas partes.
O sea, un solo código de UI con XAML, y de lógica con C#, y funcionaba en todas partes, si bien hay cosas que había (y todavía siguen siendo) específicas de cada plataforma.
Pero Xamarin Forms estaba diseñado para la versión "clasica" de .NET, y además tenía muchos problemas de rendimiento y de dificultades de actualización (en cada nueva versión que sacaban era un poco "dolor" y siempre había problemas de compatibilidad).
En 2022 llegó .NET Multi-platform App UI (.NET MAUI, otro nombre malísimo en mi opinión) que abordaba estos problemas y con el objetivo de poder crear aplicaciones multiplataforma nativas, además de para iOS y Android, también para Windows y macOS desde un único código base.
Y sí, antes de que me lo preguntes, también permite crear aplicaciones para Linux, pero a través de un proyecto de la comunidad que, en realidad lo lleva Javier Suárez Ruíz, uno de los desarrolladores de .NET MAUI en Microsoft y antiguo tutor de campusMVP. Bruno Capuano, otro antiguo autor de campusMVP y que trabaja en Microsoft, escribió un artículo bastante detallado de cómo crear tu primera app en Linux con VSCode.
.NET MAUI te permite crear aplicaciones multiplataforma para móviles y escritorio con un único código XAML, .NET y C#, con un rendimiento muy bueno, parecido al de las aplicaciones nativas, y con acceso a sensores y características del sistema operativo. De hecho, por ejemplo, en Windows utiliza por debajo WinUI para renderizar la interfaz.
Las principales "pegas" de .NET MAUI son:
- No tiene un diseñador visual para crear las interfaces
- El equipo que lo desarrolla en Microsoft es pequeño (solo hay que ver el repositorio en GitHub) por lo que va lento comparado con otras plataformas como Flutter de Google. Y, de hecho, la prioridad parece que es el desarrollo móvil más que el de escritorio, aunque se pueden hacer aplicaciones de escritorio sin problema.
- Como está todavía en pleno desarrollo, como digo, con un equipo pequeño, en algunos aspectos aún esta algo verde, si bien todo lo principal está ya estable desde .NET 7.
- También, si vas a necesitar muchas cosas específicas para cada plataforma, la ventaja de usar código compartido se diluye.
No obstante, si quieres crear aplicaciones multiplataforma con .NET sin salirte de la esfera de Microsoft, es seguramente la mejor opción en la actualidad.
Uno Platform y Avalonia
Con esto ya hemos repasado las opciones que tiene Microsoft. Para terminar vamos a ver dos alternativas que no son de Microsoft, muy conocidas y potentes, para crear aplicaciones de escritorio nativas multiplataforma con .NET:
La primera es Uno Platform, que también permite crear apps nativas para Windows, iOS, Android y macOS, pero también Linux e incluso para la Web gracias a WebAssembly (como Blazor). Y todo desde un código único escrito con XAML, .NET y C#.
La verdad es que es muy buena y es, quizá , lo que .NET MAUI debería ser. Es gratuita y Open Source pero se financian gracias a ofrecer soporte empresarial de pago y a que tienen un plugin para diseñar interfaces en Figma y generarlas automáticamente, también de pago.
La otra opción para el desarrollo multiplataforma con .NET es Avalonia UI. Es también gratuita y Open Source y muy similar a Uno Platform pero tiene un par de diferencias interesantes a tener en cuenta:
- Se centra en que la UI sea perfecta y lo más parecida posible a la nativa en todas las plataformas. Usa XAML pero no permite definir la UI mediante código C# solamente.
- Soporta también las gafas de realidad aumentada de Apple, pudiendo creara apps para VisionOS.
Avalon UI vive también de vender soporte empresarial y un plugin, en este caso uno que permite tomar las aplicaciones WPF existentes y ejecutarlas directamente en otros sistemas operativos.
Las dos son alternativas sólidas a .NET MAUI. De hecho tienen fama de ser más robustas ya que llevan mucho más tiempo en desarrollo.
La principal desventaja que tienen, la verdad, es que no son productos de Microsoft y eso le da vértigo a alguna gente. Además, al ir por libre, su hoja de ruta se podría desviar de los planes oficiales de Microsoft para el futuro. Pero hoy por hoy son muy recomendables.
Conclusiones
Bueno, ha sido un viaje largo, porque la verdad es que hay muchas opciones y además muchas se solapan ya que gran parte de ellas usan XAML para definir la interfaz.
Como conclusiones finales diría que:
- Si quieres aplicaciones de estilo gestión que solo vayan a trabajar en Windows o si son cosas sencillas y rápidas, seguramente Windows Forms sigue siendo la mejor opción.
- Si tus necesidades siguen atadas a Windows pero necesitas mayor flexibilidad, también una buena integración con el sistema y un aspecto moderno, entonces sin duda deberías tirar por WinUI 3.
- Si no quieres salirte de la órbita de Microsoft, y necesitas aplicaciones multiplataforma que funcionen en Windows, macOS, iOS y Android, entonces .NET MAUI es lo que buscas.
- Si no te importa salirte del camino marcado y quieres una plataforma potente, más robusta y con más plataformas soportadas, UNO Platform o Avalon UI llenarán tu vacío.