|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Creando un menú contextual personalizado con WinUI 3 y XAML Islands" |
| 4 | +author: Christian Amado |
| 5 | +date: 2025-05-07 00:00:00 -0300 |
| 6 | +category: [Desarrollo de software] |
| 7 | +tags: [WinDev,Windows 11,WinUI 3] |
| 8 | +thumbnail-img: /img/posts/thumbnails/win11.png |
| 9 | +cover-img: /img/posts/cover/win11.png |
| 10 | +share_img: /img/posts/shared/windows.jpg |
| 11 | +--- |
| 12 | +En las aplicaciones modernas de **Windows**, los menús contextuales juegan un rol clave en mejorar la usabilidad y la productividad del usuario. En este artículo se mostrará cómo construir un menú contextual personalizado utilizando **WinUI 3** y, opcionalmente, aprovechar **XAML Islands** para integrar componentes enriquecidos si estás migrando desde un entorno **WPF** o **WinForms**. |
| 13 | + |
| 14 | +<!--more--> |
| 15 | + |
| 16 | +## Requisitos previos |
| 17 | + |
| 18 | +- Visual Studio 2022 o superior. |
| 19 | +- Windows App SDK 1.4+ (preferiblemente 1.5). |
| 20 | +- SDK de Windows 10/11 instalado. |
| 21 | +- Conocimiento básico de XAML y WinUI 3. |
| 22 | + |
| 23 | +## Crear la base de la app en WinUI 3 |
| 24 | + |
| 25 | +```bash |
| 26 | +dotnet new winui3 -n CustomContextMenuDemo |
| 27 | +cd CustomContextMenuDemo |
| 28 | +``` |
| 29 | + |
| 30 | +Asegurate de que el `.csproj` use Windows App SDK v1.4 o superior. |
| 31 | + |
| 32 | +## Diseñar el menú contextual en XAML |
| 33 | + |
| 34 | +### Ejemplo básico: |
| 35 | + |
| 36 | +```xml |
| 37 | +<MenuFlyout x:Key="CustomContextMenu"> |
| 38 | + <MenuFlyoutItem Text="Copiar" Icon="Copy" Click="OnCopyClick"/> |
| 39 | + <MenuFlyoutItem Text="Pegar" Icon="Paste" Click="OnPasteClick"/> |
| 40 | + <MenuFlyoutSeparator /> |
| 41 | + <MenuFlyoutItem Text="Opciones avanzadas" Icon="Setting" Click="OnSettingsClick"/> |
| 42 | +</MenuFlyout> |
| 43 | +``` |
| 44 | + |
| 45 | +En el `MainWindow.xaml`: |
| 46 | + |
| 47 | +```xml |
| 48 | +<Grid RightTapped="OnGridRightTapped"> |
| 49 | + <TextBlock Text="Haz clic derecho en cualquier parte del área." /> |
| 50 | +</Grid> |
| 51 | +``` |
| 52 | + |
| 53 | +## Lógica para mostrar el menú contextual |
| 54 | + |
| 55 | +```csharp |
| 56 | +private void OnGridRightTapped(object sender, RightTappedRoutedEventArgs e) |
| 57 | +{ |
| 58 | + var menu = (MenuFlyout)this.Resources["CustomContextMenu"]; |
| 59 | + menu.ShowAt((FrameworkElement)sender, e.GetPosition((FrameworkElement)sender)); |
| 60 | +} |
| 61 | +``` |
| 62 | + |
| 63 | +## Agregar accesibilidad y teclas rápidas |
| 64 | + |
| 65 | +```xml |
| 66 | +<MenuFlyoutItem Text="Copiar" Icon="Copy" Click="OnCopyClick" KeyboardAccelerators="{KeyboardAccelerator Key=C Modifiers=Control}"/> |
| 67 | +``` |
| 68 | + |
| 69 | +También se pueden agregar `AutomationProperties.Name` para accesibilidad con narrador. |
| 70 | + |
| 71 | +## Integración opcional con XAML Islands |
| 72 | + |
| 73 | +Si migrás desde un entorno WinForms o WPF y querés mostrar un control legado (como un gráfico de WPF) dentro del menú: |
| 74 | + |
| 75 | +- Usá un `Popup` + `WindowsXamlHost` en lugar de `MenuFlyout`. |
| 76 | +- Embedí el contenido de WPF con lógica personalizada. |
| 77 | + |
| 78 | +**Nota**: Esto aplica más a proyectos híbridos, no es necesario para apps puras en WinUI 3. |
| 79 | + |
| 80 | +## Conclusión |
| 81 | + |
| 82 | +Crear menús contextuales personalizados en **WinUI 3** permite brindar una experiencia moderna y rica al usuario final, sin sacrificar la integración nativa con el sistema operativo. A medida que evoluciona **Windows App SDK**, se pueden enriquecer aún más estos menús con animaciones, bindings MVVM y controles complejos. |
0 commit comments