diff --git a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs index 40ffc31728..de6ba30a85 100644 --- a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs +++ b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs @@ -70,74 +70,76 @@ namespace Avalonia.Native var result = new NativeMenu(); var aboutItem = new NativeMenuItem("About Avalonia"); - aboutItem.Click += async (sender, e) => + + aboutItem.Click += async (_, _) => { var dialog = new AboutAvaloniaDialog(); - var mainWindow = (Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow; - - await dialog.ShowDialog(mainWindow); + if (Application.Current is + { ApplicationLifetime: IClassicDesktopStyleApplicationLifetime { MainWindow: { } mainWindow } }) + { + await dialog.ShowDialog(mainWindow); + } }; + result.Add(aboutItem); - var macOpts = AvaloniaLocator.Current.GetService() ?? new MacOSPlatformOptions(); - if (!macOpts.DisableDefaultApplicationMenuItems) - { - result.Add(new NativeMenuItemSeparator()); + return result; + } - var servicesMenu = new NativeMenuItem("Services"); - servicesMenu.Menu = new NativeMenu - { - [MacOSNativeMenuCommands.IsServicesSubmenuProperty] = true - }; - result.Add(servicesMenu); + private void PopulateStandardOSXMenuItems(NativeMenu appMenu) + { + appMenu.Add(new NativeMenuItemSeparator()); - result.Add(new NativeMenuItemSeparator()); + var servicesMenu = new NativeMenuItem("Services"); + servicesMenu.Menu = new NativeMenu { [MacOSNativeMenuCommands.IsServicesSubmenuProperty] = true }; - var hideItem = new NativeMenuItem("Hide " + Application.Current.Name) - { - Gesture = new KeyGesture(Key.H, KeyModifiers.Meta) - }; - hideItem.Click += (sender, args) => - { - _applicationCommands.HideApp(); - }; - result.Add(hideItem); + appMenu.Add(servicesMenu); + appMenu.Add(new NativeMenuItemSeparator()); - var hideOthersItem = new NativeMenuItem("Hide Others") - { - Gesture = new KeyGesture(Key.Q, KeyModifiers.Meta | KeyModifiers.Alt) - }; - hideOthersItem.Click += (sender, args) => - { - _applicationCommands.HideOthers(); - }; - result.Add(hideOthersItem); + var hideItem = new NativeMenuItem("Hide " + (Application.Current?.Name ?? "Application")) + { + Gesture = new KeyGesture(Key.H, KeyModifiers.Meta) + }; + hideItem.Click += (_, _) => + { + _applicationCommands.HideApp(); + }; - var showAllItem = new NativeMenuItem("Show All"); - showAllItem.Click += (sender, args) => - { - _applicationCommands.ShowAll(); - }; - result.Add(showAllItem); + appMenu.Add(hideItem); + + var hideOthersItem = new NativeMenuItem("Hide Others") + { + Gesture = new KeyGesture(Key.Q, KeyModifiers.Meta | KeyModifiers.Alt) + }; + hideOthersItem.Click += (_, _) => + { + _applicationCommands.HideOthers(); + }; + appMenu.Add(hideOthersItem); - result.Add(new NativeMenuItemSeparator()); + var showAllItem = new NativeMenuItem("Show All"); + showAllItem.Click += (_, _) => + { + _applicationCommands.ShowAll(); + }; - var quitItem = new NativeMenuItem("Quit") - { - Gesture = new KeyGesture(Key.Q, KeyModifiers.Meta) - }; - quitItem.Click += (sender, args) => - { - (Application.Current.ApplicationLifetime as IControlledApplicationLifetime)?.Shutdown(); - }; - result.Add(quitItem); - } + appMenu.Add(showAllItem); + appMenu.Add(new NativeMenuItemSeparator()); - return result; + var quitItem = new NativeMenuItem("Quit") { Gesture = new KeyGesture(Key.Q, KeyModifiers.Meta) }; + quitItem.Click += (_, _) => + { + if (Application.Current is { ApplicationLifetime: IControlledApplicationLifetime lifetime }) + { + lifetime.Shutdown(); + } + }; + + appMenu.Add(quitItem); } private void DoLayoutReset(bool forceUpdate = false) @@ -220,6 +222,13 @@ namespace Avalonia.Native _nativeMenu.Initialize(this, appMenuHolder, ""); + var macOpts = AvaloniaLocator.Current.GetService(); + + if (macOpts == null || !macOpts.DisableDefaultApplicationMenuItems) + { + PopulateStandardOSXMenuItems(menu); + } + setMenu = true; }