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

MAUI中如何向系统默认应用菜单项添加偏好设置?

在MAUI中向系统默认应用菜单添加偏好设置项

要给系统默认的应用名称菜单(比如macOS上的应用菜单、Windows的窗口菜单)添加偏好设置,不能自己新建同名菜单(否则会出现重复项),得直接修改系统已经生成的默认菜单,下面分平台给出具体实现:

macOS(MacCatalyst)端实现

在项目的Platforms/MacCatalyst/AppDelegate.cs文件的FinishedLaunching方法中,获取系统自带的应用菜单,然后添加菜单项:

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    // 获取系统主菜单
    var mainMenu = NSApplication.SharedApplication.MainMenu;
    if (mainMenu == null) return base.FinishedLaunching(application, launchOptions);

    // 系统主菜单的第一个子项就是应用名称菜单(比如你的"Timeliner")
    var appSubmenu = mainMenu.ItemAtIndex(0).Submenu;
    if (appSubmenu == null) return base.FinishedLaunching(application, launchOptions);

    // 添加分隔符(和系统原有菜单保持一致的样式)
    appSubmenu.AddItem(NSMenuItem.SeparatorItem);

    // 创建偏好设置菜单项
    var prefsMenuItem = new NSMenuItem("偏好设置", string.Empty);
    // 绑定点击事件,跳转到MAUI的偏好设置页面
    prefsMenuItem.Activated += (sender, e) =>
    {
        MainThread.BeginInvokeOnMainThread(() =>
        {
            // 假设你的偏好设置页路由是"//PreferencesPage",根据实际情况修改
            var shell = Application.Current.MainPage as Shell;
            shell?.GoToAsync("//PreferencesPage");
        });
    };

    // 将菜单项添加到应用菜单中
    appSubmenu.AddItem(prefsMenuItem);

    return base.FinishedLaunching(application, launchOptions);
}

Windows端实现

在项目的Platforms/Windows/App.xaml.cs文件的OnLaunched方法中,获取窗口的标题栏菜单,添加偏好设置项:

protected override void OnLaunched(LaunchActivatedEventArgs args)
{
    base.OnLaunched(args);

    var mauiWindow = Application.Current.Windows.FirstOrDefault() as MauiWinUIWindow;
    if (mauiWindow == null) return;

    var appWindow = mauiWindow.Window;
    var titleBarMenu = appWindow.AppWindow.TitleBar.Menu;

    // 添加分隔符
    var separator = new Windows.UI.Xaml.Controls.MenuFlyoutSeparator();
    titleBarMenu.Items.Add(separator);

    // 创建偏好设置菜单项
    var prefsMenuItem = new Windows.UI.Xaml.Controls.MenuFlyoutItem
    {
        Text = "偏好设置"
    };
    // 绑定点击事件,跳转到偏好设置页面
    prefsMenuItem.Click += (sender, e) =>
    {
        MainThread.BeginInvokeOnMainThread(() =>
        {
            var shell = Application.Current.MainPage as Shell;
            shell?.GoToAsync("//PreferencesPage");
        });
    };

    titleBarMenu.Items.Add(prefsMenuItem);
}

为什么之前的方法会出现重复菜单?

你之前的代码是新建了一个名为"Timeliner"的MenuBarItem并添加到页面菜单中,但macOS/Windows系统会自动为应用生成一个同名的默认应用菜单,这就导致了两个相同名称的菜单重复显示。正确的思路是找到系统已有的那个应用菜单,直接往里面添加内容,而不是自己新建。

内容的提问来源于stack exchange,提问作者TCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:52:38