diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 4cec243d0b..cbd90e1dcf 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -208,7 +208,7 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown virtual HRESULT CreateGlRenderTarget(IAvnGlSurfaceRenderTarget** ret) = 0; virtual HRESULT GetSoftwareFramebuffer(AvnFramebuffer*ret) = 0; virtual HRESULT SetMainMenu(IAvnAppMenu* menu) = 0; - virtual HRESULT GetMainMenu(IAvnAppMenu** ret) = 0; + virtual HRESULT ObtainMainMenu(IAvnAppMenu** retOut) = 0; virtual bool TryLock() = 0; virtual void Unlock() = 0; }; diff --git a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs index 5e473d9aa8..1ec5db149c 100644 --- a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs +++ b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs @@ -49,10 +49,12 @@ namespace Avalonia.Native private Dictionary _itemsToIds = new Dictionary(); private uint _revision = 1; private bool _exported = false; + private IAvnWindow _nativeWindow; - public AvaloniaNativeMenuExporter(IAvaloniaNativeFactory factory) + public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory) { _factory = factory; + _nativeWindow = nativeWindow; } public bool IsNativeMenuExported => _exported; @@ -113,8 +115,7 @@ namespace Avalonia.Native LayoutUpdated?.Invoke((_revision, 0)); - SetMenu(_menu.Items); - + SetMenu(_nativeWindow, _menu.Items); _exported = true; } @@ -231,8 +232,14 @@ namespace Avalonia.Native private void SetMenu(IAvnWindow avnWindow, ICollection menuItems) { - - var appMenu = _factory.ObtainAppMenu(); + var appMenu = avnWindow.ObtainMainMenu(); + + if(appMenu is null) + { + appMenu = _factory.CreateMenu(); + + avnWindow.SetMainMenu(appMenu); + } appMenu.Clear(); diff --git a/src/Avalonia.Native/WindowImpl.cs b/src/Avalonia.Native/WindowImpl.cs index 02c20b04ee..a7828bedaf 100644 --- a/src/Avalonia.Native/WindowImpl.cs +++ b/src/Avalonia.Native/WindowImpl.cs @@ -24,7 +24,7 @@ namespace Avalonia.Native Init(_native = factory.CreateWindow(e), factory.CreateScreens()); } - NativeMenuExporter = new AvaloniaNativeMenuExporter(factory); + NativeMenuExporter = new AvaloniaNativeMenuExporter(_native, factory); } class WindowEvents : WindowBaseEvents, IAvnWindowEvents