<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: William Amaya</title>
    <description>The latest articles on Forem by William Amaya (@williamprogramer).</description>
    <link>https://forem.com/williamprogramer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F839652%2F094ca7f6-f612-4857-9411-ddefa39dc9ff.jpg</url>
      <title>Forem: William Amaya</title>
      <link>https://forem.com/williamprogramer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/williamprogramer"/>
    <language>en</language>
    <item>
      <title>Integración de Tailwind CSS v4 Standalone en Blazor WebAssembly</title>
      <dc:creator>William Amaya</dc:creator>
      <pubDate>Mon, 23 Feb 2026 18:43:07 +0000</pubDate>
      <link>https://forem.com/williamprogramer/integracion-de-tailwind-css-v4-standalone-en-blazor-webassembly-39pi</link>
      <guid>https://forem.com/williamprogramer/integracion-de-tailwind-css-v4-standalone-en-blazor-webassembly-39pi</guid>
      <description>&lt;p&gt;Tailwind CSS v4 introduce un cambio importante: un &lt;strong&gt;CLI standalone&lt;/strong&gt; que no requiere Node.js ni npm. Esto abre la puerta a integrarlo fácilmente en proyectos .NET, incluyendo &lt;strong&gt;Blazor WebAssembly&lt;/strong&gt;, sin añadir dependencias externas ni pipelines complejos.&lt;/p&gt;

&lt;p&gt;En este artículo aprenderás a configurar Tailwind v4.2.1 en un proyecto Blazor WASM desde cero, usando únicamente el ejecutable standalone.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Introducción
&lt;/h2&gt;

&lt;p&gt;Tailwind CSS v4.2.1 incorpora un nuevo enfoque basado en un &lt;strong&gt;CLI autónomo&lt;/strong&gt;, lo que permite compilar estilos sin necesidad de Node.js, PostCSS o herramientas adicionales. Esta característica lo convierte en una opción ideal para proyectos .NET que buscan mantener un entorno limpio y ligero.&lt;/p&gt;

&lt;p&gt;El objetivo de esta guía es mostrar cómo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Descargar y preparar el CLI standalone de Tailwind.&lt;/li&gt;
&lt;li&gt;Integrarlo en un proyecto Blazor WebAssembly.&lt;/li&gt;
&lt;li&gt;Generar y vincular el CSS final.&lt;/li&gt;
&lt;li&gt;Verificar que Tailwind está funcionando correctamente.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Requisitos previos
&lt;/h2&gt;

&lt;p&gt;Antes de comenzar, asegúrate de contar con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET 7 u 8 instalado.&lt;/li&gt;
&lt;li&gt;Un proyecto Blazor WebAssembly (nuevo o existente).&lt;/li&gt;
&lt;li&gt;Windows, Linux o macOS.&lt;/li&gt;
&lt;li&gt;Permisos para modificar variables de entorno (PATH).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Descarga y preparación del CLI standalone de Tailwind
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1. Obtener el ejecutable
&lt;/h3&gt;

&lt;p&gt;Tailwind ofrece binarios standalone para cada sistema operativo. Puedes descargarlos desde:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/tailwindlabs/tailwindcss/releases" rel="noopener noreferrer"&gt;https://github.com/tailwindlabs/tailwindcss/releases&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Selecciona el archivo adecuado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;tailwindcss-windows-x64.exe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux:&lt;/strong&gt; &lt;code&gt;tailwindcss-linux-x64&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS:&lt;/strong&gt; &lt;code&gt;tailwindcss-macos-arm64&lt;/code&gt; o &lt;code&gt;macos-x64&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2. Renombrar y ubicar el ejecutable
&lt;/h3&gt;

&lt;p&gt;Para simplificar su uso:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Renombra el archivo descargado:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tailwindcss.exe   (Windows)
tailwindcss       (Linux/Mac)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Crea una carpeta para herramientas, por ejemplo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\tools\tailwind\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Mueve el ejecutable a esa carpeta.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.3. Agregar Tailwind al PATH
&lt;/h3&gt;

&lt;p&gt;Esto permite ejecutar &lt;code&gt;tailwindcss&lt;/code&gt; desde cualquier ubicación.&lt;/p&gt;

&lt;p&gt;En Windows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abre &lt;strong&gt;Configuración avanzada del sistema&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ve a &lt;strong&gt;Variables de entorno&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Edita la variable del sistema &lt;strong&gt;Path&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Agrega:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\tools\tailwind\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Guarda los cambios.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.4. Verificar instalación
&lt;/h3&gt;

&lt;p&gt;En PowerShell o CMD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tailwindcss --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salida esperada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tailwindcss v4.2.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Configuración del proyecto Blazor WebAssembly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1. Crear archivo de entrada CSS
&lt;/h3&gt;

&lt;p&gt;En &lt;code&gt;wwwroot/css/&lt;/code&gt;, crea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contenido:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"tailwindcss"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Nota: En Tailwind v4 ya no se usan &lt;code&gt;@tailwind base;&lt;/code&gt;, &lt;code&gt;@tailwind components;&lt;/code&gt; ni &lt;code&gt;@tailwind utilities;&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4.2. Generar el archivo CSS de salida
&lt;/h3&gt;

&lt;p&gt;Desde la raíz del proyecto ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tailwindcss -i wwwroot/css/input.css -o wwwroot/css/output.css --watch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lee &lt;code&gt;input.css&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Escanea archivos &lt;code&gt;.razor&lt;/code&gt;, &lt;code&gt;.html&lt;/code&gt;, &lt;code&gt;.cshtml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Genera &lt;code&gt;output.css&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mantiene un proceso activo observando cambios&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.3. Referenciar Tailwind en Blazor
&lt;/h3&gt;

&lt;p&gt;Edita &lt;code&gt;wwwroot/index.html&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"css/output.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Verificación de funcionamiento
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1. Crear un componente de prueba
&lt;/h3&gt;

&lt;p&gt;En cualquier archivo &lt;code&gt;.razor&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-5xl font-bold text-blue-600"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Tailwind funcionando correctamente
&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2. Confirmar recompilación
&lt;/h3&gt;

&lt;p&gt;Cada vez que guardes un archivo &lt;code&gt;.razor&lt;/code&gt;, la terminal donde corre &lt;code&gt;--watch&lt;/code&gt; debe mostrar actividad.&lt;/p&gt;

&lt;p&gt;Si el &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; se muestra grande y azul, Tailwind está funcionando.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Estructura final del proyecto
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/wwwroot
   /css
      input.css
      output.css
index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Consideraciones técnicas importantes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tailwind v4 no requiere &lt;code&gt;tailwind.config.js&lt;/code&gt;, aunque puedes añadirlo si necesitas personalización avanzada.&lt;/li&gt;
&lt;li&gt;El CLI standalone funciona sin Node.js, npm o PostCSS.&lt;/li&gt;
&lt;li&gt;Tailwind detecta clases en archivos &lt;code&gt;.razor&lt;/code&gt; sin configuración adicional.&lt;/li&gt;
&lt;li&gt;El modo &lt;code&gt;--watch&lt;/code&gt; es ideal para desarrollo.&lt;/li&gt;
&lt;li&gt;Para producción, usa:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tailwindcss -i wwwroot/css/input.css -o wwwroot/css/output.css --minify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Conclusión
&lt;/h2&gt;

&lt;p&gt;Integrar Tailwind CSS v4 standalone en Blazor WebAssembly es un proceso sencillo, limpio y eficiente. Al eliminar la dependencia de Node.js, el flujo de trabajo se vuelve más ligero y se adapta mejor al ecosistema .NET.&lt;/p&gt;

&lt;p&gt;Tailwind v4 ofrece una experiencia moderna, rápida y flexible, ideal para proyectos Blazor que buscan un diseño potente sin complicaciones adicionales.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>spanish</category>
      <category>tailwindcss</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>WinUI 3: Bloquear doble clic en el TitleBar</title>
      <dc:creator>William Amaya</dc:creator>
      <pubDate>Fri, 05 Dec 2025 04:01:34 +0000</pubDate>
      <link>https://forem.com/williamprogramer/winui-3-bloquear-doble-click-en-el-title-bar-82d</link>
      <guid>https://forem.com/williamprogramer/winui-3-bloquear-doble-click-en-el-title-bar-82d</guid>
      <description>&lt;p&gt;En este artículo comparto cómo interceptar mensajes de ventana en &lt;strong&gt;WinUI 3&lt;/strong&gt; usando interop con &lt;strong&gt;Win32&lt;/strong&gt;, para bloquear la acción de maximizar cuando el usuario hace doble clic en el &lt;em&gt;title bar&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivo
&lt;/h2&gt;

&lt;p&gt;Evitar que la ventana principal se maximice al hacer doble clic en la barra de título, manteniendo el resto de comportamientos intactos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgxehp32myb9jxlqbs41.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgxehp32myb9jxlqbs41.gif" alt="objetivo" width="1911" height="951"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Código completo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.UI.Windowing&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.UI.Xaml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.InteropServices&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Windows.Graphics&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;WinRT.Interop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;TestApp.WinUI3&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// An empty window that can be used on its own or navigated to within a Frame.&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MainWindow&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;_hwnd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;_oldWndProc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;delegate&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="nf"&gt;WndProcDelegate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;hWnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;wParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;lParam&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;WndProcDelegate&lt;/span&gt; &lt;span class="n"&gt;_newWndProc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;WM_NCLBUTTONDBLCLK&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0x00A3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;GWLP_WNDPROC&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MainWindow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;AppWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TitleBar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PreferredTheme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TitleBarTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseDefaultAppMode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;ExtendsContentIntoTitleBar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nf"&gt;SetTitleBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;titleBar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;OverlappedPresenter&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;presenter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OverlappedPresenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;presenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsResizable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;presenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsMaximizable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;presenter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetBorderAndTitleBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;AppWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SizeInt32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;425&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="n"&gt;AppWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetPresenter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;presenter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;_hwnd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WindowNative&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetWindowHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;_newWndProc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WndProcDelegate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WndProc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;_oldWndProc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;SetWindowLongPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_hwnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GWLP_WNDPROC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_newWndProc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="nf"&gt;WndProc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;hWnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;wParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;lParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;WM_NCLBUTTONDBLCLK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Zero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;CallWindowProc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_oldWndProc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hWnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lParam&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;DllImport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user32.dll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EntryPoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SetWindowLongPtrW"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="nf"&gt;SetWindowLongPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;hWnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WndProcDelegate&lt;/span&gt; &lt;span class="n"&gt;newProc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;DllImport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user32.dll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EntryPoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CallWindowProc"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="nf"&gt;CallWindowProc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;lpPrevWndFunc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;hWnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;wParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;lParam&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Window&lt;/span&gt; &lt;span class="na"&gt;x:Class=&lt;/span&gt;&lt;span class="s"&gt;"TestApp.WinUI3.MainWindow"&lt;/span&gt;
        &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;
        &lt;span class="na"&gt;xmlns:x=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;
        &lt;span class="na"&gt;xmlns:local=&lt;/span&gt;&lt;span class="s"&gt;"using:TestApp.WinUI3"&lt;/span&gt;
        &lt;span class="na"&gt;xmlns:d=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/expression/blend/2008"&lt;/span&gt;
        &lt;span class="na"&gt;xmlns:mc=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.openxmlformats.org/markup-compatibility/2006"&lt;/span&gt;
        &lt;span class="na"&gt;mc:Ignorable=&lt;/span&gt;&lt;span class="s"&gt;"d"&lt;/span&gt;
        &lt;span class="na"&gt;Title=&lt;/span&gt;&lt;span class="s"&gt;"TestApp"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Window.SystemBackdrop&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;MicaBackdrop&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Window.SystemBackdrop&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Grid&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"Auto"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--  TitleBar  --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--  NavigationView  --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;TitleBar&lt;/span&gt; &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;"titleBar"&lt;/span&gt;
                  &lt;span class="na"&gt;Title=&lt;/span&gt;&lt;span class="s"&gt;"TestApp"&lt;/span&gt;
                  &lt;span class="na"&gt;IsBackButtonVisible=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;
                  &lt;span class="na"&gt;IsPaneToggleButtonVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;TitleBar.IconSource&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;ImageIconSource&lt;/span&gt; &lt;span class="na"&gt;ImageSource=&lt;/span&gt;&lt;span class="s"&gt;"/Assets/logo.ico"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/TitleBar.IconSource&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/TitleBar&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/Window&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explicación paso a paso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Variables principales
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;_hwnd&lt;/code&gt;: guarda el &lt;strong&gt;handle de la ventana&lt;/strong&gt; (HWND), identificador único en Win32.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_newWndProc&lt;/code&gt;: referencia a tu método &lt;code&gt;WndProc&lt;/code&gt;, usado como interceptador.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_oldWndProc&lt;/code&gt;: puntero al procedimiento original de la ventana, para reenviar mensajes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Constantes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GWLP_WNDPROC = -4&lt;/code&gt;: índice que indica a &lt;code&gt;SetWindowLongPtr&lt;/code&gt; que quieres reemplazar el procedimiento de ventana.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WM_NCLBUTTONDBLCLK = 0x00A3&lt;/code&gt;: mensaje que Windows envía al hacer doble clic en la barra de título.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Delegado
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;delegate&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="nf"&gt;WndProcDelegate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;hWnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;wParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;lParam&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Define la &lt;strong&gt;firma&lt;/strong&gt; del método que interceptará mensajes. Es el equivalente a un puntero a función seguro en C#.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Reemplazo del WndProc
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;_oldWndProc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;SetWindowLongPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_hwnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GWLP_WNDPROC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_newWndProc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Cambia el procedimiento de ventana por tu método.&lt;/li&gt;
&lt;li&gt;Guarda el original en &lt;code&gt;_oldWndProc&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Reenvío de mensajes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;CallWindowProc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_oldWndProc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hWnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lParam&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Si no es el mensaje que quieres bloquear, lo reenvías al WndProc original.&lt;/li&gt;
&lt;li&gt;Así mantienes el comportamiento estándar de la ventana.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Bloqueo del doble clic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;WM_NCLBUTTONDBLCLK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Zero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Intercepta el mensaje de doble clic en la barra de título.&lt;/li&gt;
&lt;li&gt;Devuelve &lt;code&gt;IntPtr.Zero&lt;/code&gt; para bloquear la acción de maximizar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dudas frecuentes aclaradas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;¿Qué es &lt;code&gt;_hwnd&lt;/code&gt;?&lt;/strong&gt; → El identificador nativo de la ventana (HWND).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿Qué es un delegado?&lt;/strong&gt; → Un tipo seguro que representa un puntero a función en C#. Aquí define la firma de &lt;code&gt;WndProc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿Por qué usar &lt;code&gt;_oldWndProc&lt;/code&gt;?&lt;/strong&gt; → Para reenviar mensajes al procedimiento original y no romper la ventana.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿Qué significa &lt;code&gt;GWLP_WNDPROC = -4&lt;/code&gt;?&lt;/strong&gt; → Es el índice que indica a Windows que quieres reemplazar el procedimiento de ventana.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿Por qué &lt;code&gt;SetWindowLongPtrW&lt;/code&gt; y no &lt;code&gt;SetWindowLongPtr&lt;/code&gt;?&lt;/strong&gt; → La versión &lt;code&gt;W&lt;/code&gt; es Unicode, compatible con C#.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿Por qué &lt;code&gt;CallWindowProc&lt;/code&gt; no necesita EntryPoint?&lt;/strong&gt; → Porque el nombre coincide exactamente con la función exportada en la DLL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpnrc10fq2643lktc4t5y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpnrc10fq2643lktc4t5y.gif" alt="conclusion" width="1920" height="915"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con este patrón puedes interceptar mensajes nativos en WinUI 3 y modificar comportamientos específicos de la ventana, como bloquear la maximización por doble clic en el &lt;em&gt;title bar&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>winui3</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Cómo solucioné el error “The property 'ParameterName' contains invalid characters” en SSIS</title>
      <dc:creator>William Amaya</dc:creator>
      <pubDate>Fri, 07 Nov 2025 02:03:43 +0000</pubDate>
      <link>https://forem.com/williamprogramer/como-solucione-el-error-the-property-parametername-contains-invalid-characters-en-ssis-jb</link>
      <guid>https://forem.com/williamprogramer/como-solucione-el-error-the-property-parametername-contains-invalid-characters-en-ssis-jb</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;Mientras trabajaba con proyectos de Integration Services (SSIS) en SQL Server Management Studio, me encontré con este error al intentar desplegar un proyecto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The property 'ParameterName' contains invalid characters as an object name.
Remove the invalid characters. (Microsoft.SqlServer.Management.IntegrationServices)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este mensaje puede parecer confuso, pero en mi caso, la causa no estaba en los parámetros directamente, sino en el nombre del &lt;code&gt;Connection Manager&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagnóstico del problema
&lt;/h2&gt;

&lt;p&gt;Después de revisar los parámetros y no encontrar caracteres inválidos, descubrí que el error se debía al nombre del &lt;code&gt;Connection Manager&lt;/code&gt;. Había usado un nombre como: &lt;code&gt;Servidor-Principal/Base#Datos&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Este tipo de nombre incluye caracteres que SQL Server considera inválidos para identificadores de objetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solución aplicada
&lt;/h2&gt;

&lt;p&gt;Renombré el Connection Manager usando solo letras, números y guiones bajos. En mi caso, lo cambié a: &lt;code&gt;Servidor.Database&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Después de este cambio, el proyecto se desplegó sin errores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recomendaciones
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Evita usar espacios, guiones, signos de puntuación o símbolos especiales en nombres de &lt;code&gt;parámetros&lt;/code&gt; y &lt;code&gt;Connection Managers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usa nombres como &lt;code&gt;Servidor_Database&lt;/code&gt;, &lt;code&gt;MainServer_DB&lt;/code&gt;, o &lt;code&gt;Conexion_Produccion&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si trabajas en equipo, define una convención de nombres clara para evitar este tipo de errores.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sqlserver</category>
      <category>ssis</category>
      <category>microsoft</category>
      <category>etl</category>
    </item>
    <item>
      <title>Soporte multilenguaje en WinUI 3</title>
      <dc:creator>William Amaya</dc:creator>
      <pubDate>Sat, 01 Nov 2025 04:08:26 +0000</pubDate>
      <link>https://forem.com/williamprogramer/soporte-multilenguaje-en-winui-3-jmm</link>
      <guid>https://forem.com/williamprogramer/soporte-multilenguaje-en-winui-3-jmm</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;El soporte multilenguaje en aplicaciones permite ampliar el alcance a usuarios y clientes de diferentes regiones e idiomas, mejorando la accesibilidad y la experiencia del usuario. En este post, exploraremos cómo implementarlo en aplicaciones de escritorio desarrolladas con &lt;code&gt;WinUI 3&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuración del proyecto
&lt;/h2&gt;

&lt;p&gt;Para implementar soporte multilenguaje en una aplicación &lt;code&gt;WinUI 3&lt;/code&gt;, el primer paso es configurar la estructura de carpetas y archivos de recursos. Esto permitirá que el sistema cargue los textos adecuados según el idioma del usuario.&lt;/p&gt;

&lt;h3&gt;
  
  
  Crear la carpeta &lt;code&gt;Strings&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Dentro del proyecto, en la raiz crea una carpeta llamada &lt;code&gt;Strings&lt;/code&gt;. Esta será el contenedor principal para los recursos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Strings\
├── en-US\
│   └── Resources.resw
├── es-ES\
│   └── Resources.resw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ¿Qué es el archivo &lt;code&gt;Resources.resw&lt;/code&gt; y para qué se utiliza?
&lt;/h4&gt;

&lt;p&gt;El archivo &lt;code&gt;Resources.resw&lt;/code&gt; es un contenedor de recursos en formato &lt;code&gt;XML&lt;/code&gt; que se utiliza en aplicaciones para definir textos y cadenas.&lt;/p&gt;

&lt;p&gt;Pero en el contexto de este post, su propósito principal es permitir que la interfaz de usuario muestre contenido en el idioma correspondiente según la configuración regional del sistema o la preferencia del usuario.&lt;/p&gt;

&lt;p&gt;Cada entrada se define como un par clave–valor, donde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La &lt;code&gt;clave&lt;/code&gt; es un identificador único que se usa en el código.&lt;/li&gt;
&lt;li&gt;El &lt;code&gt;valor&lt;/code&gt; es el texto traducido que se mostrará al usuario.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de entrada en &lt;code&gt;Resources.resw&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;data&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Message"&lt;/span&gt; &lt;span class="na"&gt;xml:space=&lt;/span&gt;&lt;span class="s"&gt;"preserve"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;Bienvenido&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/data&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;data&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Message"&lt;/span&gt; &lt;span class="na"&gt;xml:space=&lt;/span&gt;&lt;span class="s"&gt;"preserve"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;Welcome&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/data&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Implementación
&lt;/h2&gt;

&lt;p&gt;Para establecer el idioma en la aplicación lo debes hacer antes que cargue la ventana principal de la aplicación, esto lo puedes especificar en la clase &lt;code&gt;App.xaml.cs&lt;/code&gt; en el metodo &lt;code&gt;OnLaunched&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ApplicationLanguages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrimaryLanguageOverride&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"es-ES"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// Invoked when the application is launched.&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;param name="args"&amp;gt;Details about the launch request and process.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnLaunched&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LaunchActivatedEventArgs&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ApplicationData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LocalSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryGetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;ApplicationLanguages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrimaryLanguageOverride&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;ApplicationLanguages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrimaryLanguageOverride&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"es-ES"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;_window&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MainWindow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;_window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Activate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto logramos que cuando se ejecute la aplicación el sistema cargue los &lt;code&gt;resources.resw&lt;/code&gt; según el idioma seleccionado.&lt;/p&gt;

&lt;p&gt;Para que el usuario pueda seleccionar el idioma de su preferencia podemos usar diferentes controles en este caso utilizaremos el control &lt;code&gt;ComboBox&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ComboBox&lt;/span&gt; &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;"LanguageSelector"&lt;/span&gt;
          &lt;span class="na"&gt;SelectionChanged=&lt;/span&gt;&lt;span class="s"&gt;"LanguageSelector_SelectionChanged"&lt;/span&gt;
          &lt;span class="na"&gt;PlaceholderText=&lt;/span&gt;&lt;span class="s"&gt;"Select a language"&lt;/span&gt;
          &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"200"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ComboBoxItem&lt;/span&gt; &lt;span class="na"&gt;Tag=&lt;/span&gt;&lt;span class="s"&gt;"en-US"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;English&lt;span class="nt"&gt;&amp;lt;/ComboBoxItem&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ComboBoxItem&lt;/span&gt; &lt;span class="na"&gt;Tag=&lt;/span&gt;&lt;span class="s"&gt;"es-ES"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Español&lt;span class="nt"&gt;&amp;lt;/ComboBoxItem&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ComboBox&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez definimos el control podemos disparar el evento &lt;code&gt;SelectionChanged&lt;/code&gt; el cual se ejecuta cada vez que el usuario cambie la opción del control &lt;code&gt;ComboBox&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.UI.Xaml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.UI.Xaml.Controls&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Windows.AppLifecycle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Windows.ApplicationModel.Resources&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Windows.Storage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LanguageSelector_SelectionChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SelectionChangedEventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LanguageSelector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedItem&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;ComboBoxItem&lt;/span&gt; &lt;span class="n"&gt;comboBoxItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ApplicationData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LocalSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;comboBoxItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ApplicationData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LocalSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comboBoxItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;AppInstance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La opción que el usuario seleccione la debemos guardar, puede ser en una base de datos también archivos de recursos por ejemplo un archivo &lt;code&gt;.json&lt;/code&gt; o almacenamiento interno del sistema usando &lt;code&gt;LocalSettings&lt;/code&gt; del &lt;code&gt;using Windows.Storage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para acceder a los valores de los archivos &lt;code&gt;resources.resw&lt;/code&gt; podemos realizarlo de la siguiente manera en el code-behind.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Windows.ApplicationModel.Resources&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ResourceLoader&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Message"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y desde nuestro frontend podemos acceder usando esa propiedad &lt;code&gt;Message&lt;/code&gt; mediante el uso del &lt;code&gt;Binding&lt;/code&gt;de la siguiente manera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;TextBlock&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{x:Bind Message}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/TextBlock&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Comparto el resultado final de la implementación del soporte multilenguaje para una aplicación &lt;code&gt;WinUI 3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgnptk4516bfk0vbodhw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgnptk4516bfk0vbodhw.gif" alt=" " width="760" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Notas y mejoras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Se puede implementar usando &lt;code&gt;MVVM&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La clase &lt;code&gt;ResourceLoader&lt;/code&gt; se puede abstraer creando una clase &lt;code&gt;helper&lt;/code&gt; o &lt;code&gt;provider&lt;/code&gt; implementando &lt;code&gt;IoC&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La aplicación actualmente se debe reiniciar para cargar los archivos de recursos desde el inicio de la ventana pero podrías implementar con archivos &lt;code&gt;.json&lt;/code&gt; y propiedades usando la interfaz &lt;code&gt;INotifyPropertyChanged&lt;/code&gt; o usando el paquete nuget &lt;code&gt;CommunityToolkit.Mvvm&lt;/code&gt; para evitar el reinicio de la aplicación.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>winui3</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
