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
相关产品推荐
相关产品推荐

