{"id":177,"date":"2026-04-12T14:56:25","date_gmt":"2026-04-12T14:56:25","guid":{"rendered":"https:\/\/rfog.es\/?p=177"},"modified":"2026-04-12T14:56:25","modified_gmt":"2026-04-12T14:56:25","slug":"winui-3-historia-arquitectura-wpf-winrt","status":"publish","type":"post","link":"https:\/\/rfog.es\/?p=177","title":{"rendered":"WinUI 3 al Desnudo: De los Handles de Windows al Renderizado Moderno"},"content":{"rendered":"<p><small><em>Este texto ha sido generado por Gemini 2.5\/3.1 a partir del audio del autor. El contenido y las ideas son \u00edntegramente del autor; la redacci\u00f3n ha sido asistida por IA.<\/em><\/small><\/p>\n<hr \/>\n<p>\u00bfQu\u00e9 pasa, pat\u00e1ticas m\u00edas? Aqu\u00ed vuestro reportero maricharachero para continuar con la serie sobre WinRT. Hoy nos sumergimos de lleno en WinUI 3, y os adelanto que todo lo que os cont\u00e9 sobre WinRT sigue siendo perfectamente v\u00e1lido, porque WinUI no es m\u00e1s que la aplicaci\u00f3n pr\u00e1ctica de toda esa tecnolog\u00eda para construir las interfaces gr\u00e1ficas de las aplicaciones modernas.<\/p>\n<h2>Un Viaje al Pasado: Win32, Handles y los Primeros Frameworks<\/h2>\n<p>Para entender WinUI, hay que retroceder. Frameworks como Windows Forms eran, en esencia, una capa relativamente fina que envolv\u00eda los componentes nativos de Windows: el bot\u00f3n, el cuadro de edici\u00f3n, el checkbox&#8230; todo. Nos abstra\u00edan del famoso \u00abhandle de ventana\u00bb o <code>HWND<\/code>.<\/p>\n<p>Aqu\u00ed viene la an\u00e9cdota para los m\u00e1s j\u00f3venes. En el viejo Win32, todo, absolutamente todo, era una ventana. Por eso se llama Windows. Un simple campo de texto era una ventana con su propio handle. Esto ten\u00eda una consecuencia brutal: Windows ten\u00eda un n\u00famero limitado de handles gr\u00e1ficos, unos 65.536.<\/p>\n<p>\u00bfQu\u00e9 significaba esto? Que si abr\u00edas una aplicaci\u00f3n gr\u00e1ficamente intensa como el viejo Borland C++ Builder, con sus toolbars llenas de iconitos (cada uno una ventana), y luego abr\u00edas otra similar, pod\u00edas agotar los handles. El resultado era que los gr\u00e1ficos no se ve\u00edan, o peor, la aplicaci\u00f3n reventaba. La \u00fanica soluci\u00f3n era cerrar programas o, en el peor de los casos, reiniciar Windows. \u00a1Ah, los maravillosos a\u00f1os 90!<\/p>\n<h2>La Guerra Civil de Microsoft: La Tumultuosa Llegada de WPF<\/h2>\n<p>Luego lleg\u00f3 WPF (Windows Presentation Foundation), que en sus primeras versiones segu\u00eda dependiendo de este sistema de handles. Aunque introdujo una capa muy potente encima, con XAML y un sistema de layout que nos ahorraba los c\u00e1lculos manuales que sufr\u00edamos en MFC, su nacimiento fue&#8230; complicado.<\/p>\n<p>Cuando Microsoft decidi\u00f3 que la interfaz de Visual Studio deb\u00eda rehacerse en WPF, se top\u00f3 con un muro. El equipo de Visual Studio, de los pocos sin pelos en la lengua, les dijo sin rodeos que aquello era \u00abuna puta mierda pinchada en un puto palo de mierda\u00bb. Y ten\u00edan raz\u00f3n. Yo mismo, en media hora, report\u00e9 7 u 8 bugs grav\u00edsimos en la primera versi\u00f3n. Esas demos espectaculares de Microsoft eran humo; en la pr\u00e1ctica, nada funcionaba.<\/p>\n<p>Tras una buena raci\u00f3n de \u00abarrojo de bo\u00f1igas de mierda\u00bb interno, Microsoft se puso las pilas y arregl\u00f3 WPF. La primera versi\u00f3n de Visual Studio con WPF fue lenta y tosca, pero las siguientes mejoraron hasta el punto de que, a partir de .NET Framework 4.7, funciona francamente bien.<\/p>\n<h2>El Problema de Estar Atado al Sistema Operativo<\/h2>\n<p>\u00bfCu\u00e1l fue la soluci\u00f3n m\u00e1gica para arreglar WPF? Integrar su motor directamente en el n\u00facleo de Windows. Las DLLs que antes ven\u00edan con el instalador de .NET Framework ahora formaban parte del propio sistema operativo. Esto solucion\u00f3 los problemas de rendimiento, pero cre\u00f3 uno nuevo y gigantesco.<\/p>\n<p>Cada vez que necesitaban corregir un bug o a\u00f1adir una mejora a WPF, ten\u00edan que lanzar una actualizaci\u00f3n completa de Windows. Esto era insostenible. \u00bfRecord\u00e1is esas actualizaciones de .NET Framework que tardaban una eternidad en instalarse? Probablemente se deb\u00edan a esto. El sistema estaba recompilando y optimizando el c\u00f3digo para tu m\u00e1quina espec\u00edfica, un proceso lento y pesado.<\/p>\n<h2>Nace WinUI 3: La Independencia del Framework<\/h2>\n<p>La necesidad de agilidad, especialmente con la llegada de las apps de la tienda de Windows (UWP) y el problema de una ABI (Application Binary Interface) fija, oblig\u00f3 a Microsoft a cambiar de estrategia. Usando la misma tecnolog\u00eda de componentes COM que vimos en WinRT, decidieron sacar el motor de UI fuera del n\u00facleo de Windows.<\/p>\n<p>As\u00ed naci\u00f3 WinUI 3. Es, en esencia, la evoluci\u00f3n de WPF desacoplada del sistema operativo. Este proceso, como era de esperar, no fue trivial y trajo nuevas ineficiencias. Al tener que comunicar entre el espacio de usuario (anillo 3) y el kernel (anillo 0), se introdujo una latencia que lo hizo m\u00e1s lento en ciertos aspectos.<\/p>\n<h2>El Motor de WinUI 3: Dos Hilos y Mucho DirectX<\/h2>\n<p>La arquitectura de WinUI 3 es un batiburrillo interesante de tecnolog\u00edas: Win32, WinRT y, sobre todo, DirectX. Por ah\u00ed le\u00ed una descripci\u00f3n que sonaba a \u00abm\u00e9todo cu\u00e1ntico arquitect\u00f3nico indispensable\u00bb, pero en cristiano, se basa en un modelo de dos hilos para lograr su rendimiento.<\/p>\n<p>Por un lado, est\u00e1 el <strong>hilo de la UI (UI-Thread)<\/strong>, que se encarga de procesar la l\u00f3gica, ejecutar el c\u00f3digo XAML y componer el \u00e1rbol visual de lo que se va a mostrar. Aqu\u00ed entran en juego optimizaciones cl\u00e1sicas de Windows, como las \u00e1reas de recorte, que evitan redibujar lo que no es necesario.<\/p>\n<p>Una vez compuesto el \u00abqu\u00e9\u00bb se va a pintar, se le pasa el trabajo al <strong>hilo del compositor (Compositor-Thread)<\/strong>. Este segundo hilo se comunica directamente con el hardware a trav\u00e9s de DirectX para renderizar la escena en la pantalla. Esta separaci\u00f3n es la clave de su rendimiento en aplicaciones gr\u00e1ficamente intensas, ya que el dibujado no bloquea la l\u00f3gica de la aplicaci\u00f3n.<\/p>\n<h2>Adi\u00f3s al <code>Invoke<\/code>: <code>Async\/Await<\/code> al Rescate de la UI<\/h2>\n<p>Un principio sagrado en el desarrollo de UI es mantener el hilo principal lo m\u00e1s libre posible para que la aplicaci\u00f3n siempre responda. Antiguamente, si estabas en un hilo secundario y quer\u00edas actualizar un texto en la pantalla, ten\u00edas que usar <code>Invoke<\/code> o <code>BeginInvoke<\/code> para enviar esa orden de vuelta al hilo principal.<\/p>\n<p>WinUI 3, junto con las versiones modernas de C#, simplifica esto dr\u00e1sticamente gracias a <code>async\/await<\/code>. Ahora, desde un m\u00e9todo as\u00edncrono, puedes modificar un elemento de la interfaz directamente. El compilador y el framework se encargan por arte de magia de gestionar los hilos y las m\u00e1quinas de estado para que todo funcione sin bloquear la UI. Se acab\u00f3 el <code>Invoke<\/code>.<\/p>\n<h2>La Experiencia del Desarrollador: Sin Dise\u00f1ador Visual pero con Hot Reload<\/h2>\n<p>Un cambio importante para los que venimos del mundo cl\u00e1sico es que en WinUI 3 no hay un dise\u00f1ador visual de XAML en Visual Studio. Si abres un fichero y no ves la vista previa, ya sabes que est\u00e1s en el mundo moderno.<\/p>\n<p>El flujo de trabajo ahora se basa en ejecutar la aplicaci\u00f3n y modificar el XAML en caliente usando la funci\u00f3n <strong>Hot Reload<\/strong>. Le das a recargar y los cambios aparecen al instante en la ventana. Bueno, en teor\u00eda. A veces funciona y a veces no, sobre todo si tocas cosas del patr\u00f3n MVVM, oblig\u00e1ndote a volver al m\u00e9todo cl\u00e1sico de cerrar, recompilar y ejecutar.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Y este ha sido nuestro viaje por las entra\u00f1as de WinUI 3. Como veis, es el resultado de d\u00e9cadas de evoluci\u00f3n, dramas internos en Microsoft y una b\u00fasqueda constante por un framework de UI potente y desacoplado. Mucho de esto es historia que he vivido, y otra parte es conocimiento que le he sonsacado a Gemini para complementar mis batallitas.<\/p>\n<p>Por cierto, no he querido dejarme fuera la ca\u00f3tica gesti\u00f3n de versiones de .NET Core, con sus m\u00faltiples ABIs incompatibles y esa man\u00eda de dejar instaladas 50 versiones en el sistema. Es otro de esos detalles que forman parte de la historia de esta tecnolog\u00eda. \u00a1Espero que esta explicaci\u00f3n os haya aclarado el panorama y os haya entretenido! \u00a1Adi\u00f3s, mis pataticas!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Explora la historia y arquitectura de WinUI 3. Desde los l\u00edmites de handles en Win32 y el drama de WPF hasta el moderno renderizado con DirectX y async\/await.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[55,52,69,70,71],"class_list":["post-177","post","type-post","status-publish","format-standard","hentry","category-podcastexto","tag-desarrollo-windows","tag-winrt","tag-winui-3","tag-wpf","tag-xaml"],"_links":{"self":[{"href":"https:\/\/rfog.es\/index.php?rest_route=\/wp\/v2\/posts\/177","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rfog.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rfog.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rfog.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/rfog.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=177"}],"version-history":[{"count":1,"href":"https:\/\/rfog.es\/index.php?rest_route=\/wp\/v2\/posts\/177\/revisions"}],"predecessor-version":[{"id":180,"href":"https:\/\/rfog.es\/index.php?rest_route=\/wp\/v2\/posts\/177\/revisions\/180"}],"wp:attachment":[{"href":"https:\/\/rfog.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rfog.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rfog.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}