Compartir a través de


Mostrar un menú contextual en una aplicación de escritorio de .NET MAUI

Un menú contextual, que a menudo se conoce como menú de botón derecho, ofrece comandos contextuales específicos del control en el que se hace clic. En .NET Multi-platform App UI (.NET MAUI), se puede agregar un menú contextual a cualquier control que derive de Element, en Mac Catalyst y Windows. Esto incluye todas las páginas, diseños y vistas.

Un menú contextual se define con un MenuFlyout, que puede constar de los elementos secundarios siguientes:

  • MenuFlyoutItem, que representa un elemento de menú en el que se puede hacer clic.
  • MenuFlyoutSubItem, que representa un elemento de submenú en el que se puede hacer clic.
  • MenuFlyoutSeparator, que es una línea horizontal que separa los elementos del menú.

MenuFlyoutSubItem se deriva de MenuFlyoutItem que, a su vez, se deriva de MenuItem. MenuItem define varias propiedades que permiten especificar la apariencia y el comportamiento de un elemento de menú. La apariencia de un elemento de menú, o subelemento, se puede definir estableciendo las propiedades Text y IconImageSource. La respuesta a un clic de un elemento de menú, o subelemento, se puede definir estableciendo las propiedades Clicked, Command y CommandParameter. Para obtener más información sobre elementos de menú, consulta Mostrar elementos de menú.

Advertencia

Actualmente no se admite un menú contextual en Entry en Mac Catalyst.

Crear elementos de menú contextual

Se puede agregar un objeto MenuFlyout a la propiedad adjunta FlyoutBase.ContextFlyout de cualquier control que derive de Element. Cuando el usuario hace clic con el botón derecho en el control, el menú contextual aparecerá en la ubicación en la que se hizo clic en el puntero.

En el ejemplo siguiente se muestra un WebView que define un menú contextual:

<WebView x:Name="webView"
         Source="https://learn.microsoft.com/dotnet/maui"
         MinimumHeightRequest="400">
    <FlyoutBase.ContextFlyout>
        <MenuFlyout>
            <MenuFlyoutItem Text="Go to docs repo"
                            Clicked="OnWebViewGoToRepoClicked"
                            CommandParameter="docs" />
            <MenuFlyoutItem Text="Go to engineering repo"
                            Clicked="OnWebViewGoToRepoClicked"
                            CommandParameter="eng" />
        </MenuFlyout>
    </FlyoutBase.ContextFlyout>
</WebView>

En este ejemplo, el menú contextual define dos elementos de menú:

Screenshot of a context menu on a WebView.

Cuando se hace clic en un elemento de menú, se ejecuta el controlador de eventos OnWebViewGoToRepoClicked:

void OnWebViewGoToRepoClicked(object sender, EventArgs e)
{
    MenuFlyoutItem menuItem = sender as MenuFlyoutItem;
    string repo = menuItem.CommandParameter as string;
    string url = repo == "docs" ? "docs-maui" : "maui";
    webView.Source = new UrlWebViewSource { Url = $"https://github.com/dotnet/{url}" };
}

El controlador de eventos OnWebViewGoToRepoClicked recupera el valor de propiedad CommandParameter del objeto MenuFlyoutItem en el que se hizo clic, y usa su valor para compilar la dirección URL a la que navega WebView.

Advertencia

Actualmente no es posible agregar elementos al MenuFlyout en tiempo de ejecución ni quitarle.

Se pueden agregar aceleradores de teclado a los elementos de menú contextual, de modo que se pueda invocar un elemento de menú contextual a través de un método abreviado de teclado. Para obtener más información, consulta Aceleradores de teclado.

Crear elementos de submenú

Se pueden agregar elementos de submenú a un menú contextual agregando uno o varios objetos MenuFlyoutSubItem a MenuFlyout:

<Label x:Name="label"
       Text="Right-click to choose color">
   <FlyoutBase.ContextFlyout>
       <MenuFlyout>
           <MenuFlyoutItem Text="Black"
                           Clicked="OnLabelClicked"
                           CommandParameter="Black" />
           <MenuFlyoutSubItem Text="Light">
               <MenuFlyoutItem Text="Blue"
                               Clicked="OnLabelClicked"
                               CommandParameter="LightBlue" />
               <MenuFlyoutItem Text="Coral"
                               Clicked="OnLabelClicked"
                               CommandParameter="LightCoral" />
               <MenuFlyoutItem Text="Cyan"
                               Clicked="OnLabelClicked"
                               CommandParameter="LightCyan" />
           </MenuFlyoutSubItem>
           <MenuFlyoutSubItem Text="Dark">
               <MenuFlyoutItem Text="Blue"
                               Clicked="OnLabelClicked"
                               CommandParameter="DarkBlue" />
               <MenuFlyoutItem Text="Cyan"
                               Clicked="OnLabelClicked"
                               CommandParameter="DarkCyan" />
               <MenuFlyoutItem Text="Magenta"
                               Clicked="OnLabelClicked"
                               CommandParameter="DarkMagenta" />
           </MenuFlyoutSubItem>
       </MenuFlyout>
   </FlyoutBase.ContextFlyout>
</Label>

En este ejemplo, el menú contextual define un elemento de menú y dos submenús que cada uno contiene tres elementos de menú:

Screenshot of a context menu with sub-menu items.

Mostrar iconos en elementos de menú

MenuFlyoutItem y MenuFlyoutSubItem heredan la propiedad IconImageSource de MenuItem, que permite mostrar un icono pequeño junto al texto de un elemento de menú contextual. Este icono puede ser una imagen o un icono de fuente.

Advertencia

Mac Catalyst no admite la visualización de iconos en elementos de menú contextual.

En el ejemplo siguiente se muestra un menú contextual, donde los iconos de los elementos de menú se definen mediante iconos de fuente:

<Button Text="&#x25B6;&#xFE0F; Play"
        WidthRequest="80">
    <FlyoutBase.ContextFlyout>
        <MenuFlyout>
            <MenuFlyoutItem Text="Pause"
                            Clicked="OnPauseClicked">
                <MenuFlyoutItem.IconImageSource>
                    <FontImageSource Glyph="&#x23F8;"
                                     FontFamily="Arial" />
                </MenuFlyoutItem.IconImageSource>
            </MenuFlyoutItem>
            <MenuFlyoutItem Text="Stop"
                            Clicked="OnStopClicked">
                <MenuFlyoutItem.IconImageSource>
                    <FontImageSource Glyph="&#x23F9;"
                                     FontFamily="Arial" />
                </MenuFlyoutItem.IconImageSource>
            </MenuFlyoutItem>
        </MenuFlyout>
    </FlyoutBase.ContextFlyout>
</Button>

En este ejemplo, el menú contextual define dos elementos de menú que muestran un icono y texto en Windows:

Screenshot of a context menu that uses icons.

Para obtener más información sobre cómo mostrar iconos de fuente, consulta Mostrar iconos de fuente. Para obtener información sobre cómo agregar imágenes a proyectos de .NET MAUI, consulta Incorporación de imágenes a un proyecto de aplicación .NET MAUI.