You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI中Android/iOS平台是否有上下文菜单共享/原生组件?

在.NET MAUI移动端实现上下文菜单的方案

首先明确:.NET MAUI官方自带的ContextMenu组件目前仅支持桌面平台(Windows、macOS),Android和iOS没有原生共享的上下文菜单组件,但可以通过以下两种方式实现和桌面端类似的功能:

一、利用平台原生控件实现(推荐,贴合原生体验)

通过MAUI的Handler机制获取对应平台的原生视图,调用各自的原生菜单组件:

Android端:使用PopupMenu

在长按事件中获取Android原生View,创建并显示PopupMenu:

// 在MAUI页面的代码后台
private void OnLabelLongPressed(object sender, LongPressedEventArgs e)
{
    if (sender is Label label && label.Handler?.PlatformView is Android.Views.View nativeView)
    {
        var popupMenu = new Android.Widget.PopupMenu(MauiProgram.Current.Services.GetService<Activity>(), nativeView);
        popupMenu.MenuInflater.Inflate(Resource.Menu.context_menu, popupMenu.Menu);
        
        popupMenu.MenuItemClick += (s, args) =>
        {
            switch (args.Item.ItemId)
            {
                case Resource.Id.menu_copy:
                    // 执行复制逻辑
                    break;
                case Resource.Id.menu_share:
                    // 执行分享逻辑
                    break;
            }
        };
        
        popupMenu.Show();
    }
}

需要在Android项目的Resources/Menu目录下创建context_menu.xml菜单布局。

iOS端:使用UIMenuController

同样在长按事件中获取iOS原生UIView,配置UIMenuController:

// 在MAUI页面的代码后台
private void OnLabelLongPressed(object sender, LongPressedEventArgs e)
{
    if (sender is Label label && label.Handler?.PlatformView is UIKit.UIView nativeView)
    {
        var menuController = UIKit.UIMenuController.SharedMenuController;
        var copyItem = UIKit.UIMenuItem.FromTitle("复制", new ObjCRuntime.Selector("CopyAction:"));
        var shareItem = UIKit.UIMenuItem.FromTitle("分享", new ObjCRuntime.Selector("ShareAction:"));
        
        menuController.MenuItems = new[] { copyItem, shareItem };
        nativeView.BecomeFirstResponder();
        menuController.SetTargetRect(nativeView.Frame, nativeView.Superview);
        menuController.SetMenuVisible(true, true);
    }
}

// 页面类中添加对应的选择器方法
[Foundation.Export("CopyAction:")]
private void CopyAction(UIKit.UIMenuItem item)
{
    // 执行复制逻辑
}

[Foundation.Export("ShareAction:")]
private void ShareAction(UIKit.UIMenuItem item)
{
    // 执行分享逻辑
}

跨平台统一触发

可以通过MAUI的LongPressedGestureRecognizer给需要添加上下文菜单的控件绑定长按事件,然后在事件处理中根据当前平台调用对应逻辑:

<!-- 在XAML中给Label添加长按识别器 -->
<Label Text="长按我显示菜单">
    <Label.GestureRecognizers>
        <LongPressedGestureRecognizer Command="{Binding ShowContextMenuCommand}" CommandParameter="{Binding .}" />
    </Label.GestureRecognizers>
</Label>

再在ViewModel或代码后台中判断平台,调用对应的原生实现。

二、使用第三方组件

部分MAUI第三方库提供了跨平台的上下文菜单实现,比如基于弹窗组件模拟上下文菜单,但这类组件的体验通常不如原生控件贴合平台规范,需要自行评估适配性。

内容的提问来源于stack exchange,提问作者Gabriel Ribeiro Rossi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:10:26