From f5e771d49790f40f9a930cde1eb620ad4b579a18 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Thu, 26 Feb 2026 10:59:43 +0000 Subject: [PATCH] Fix menu memory leak (#20753) * Add test for menu memory leak * Fix menu memory leak --- src/Avalonia.Controls/Menu.cs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Controls/Menu.cs b/src/Avalonia.Controls/Menu.cs index 56137287a0..59058c8ee0 100644 --- a/src/Avalonia.Controls/Menu.cs +++ b/src/Avalonia.Controls/Menu.cs @@ -13,6 +13,8 @@ namespace Avalonia.Controls /// public class Menu : MenuBase, IMainMenu { + private IAccessKeyHandler? _accessKeyHandler; + private static readonly FuncTemplate DefaultPanel = new (() => new StackPanel { Orientation = Orientation.Horizontal }); @@ -43,7 +45,7 @@ namespace Avalonia.Controls AccessKeyHandler.AccessKeyPressedEvent.AddClassHandler(OnAccessKeyPressed); } - /// + /// public override void Close() { if (!IsOpen) @@ -66,7 +68,7 @@ namespace Avalonia.Controls }); } - /// + /// public override void Open() { if (IsOpen) @@ -88,12 +90,19 @@ namespace Avalonia.Controls { base.OnAttachedToVisualTree(e); - var inputRoot = e.Root as TopLevel; + _accessKeyHandler = TopLevel.GetTopLevel(this)?.AccessKeyHandler; + if (_accessKeyHandler is not null) + _accessKeyHandler.MainMenu = this; + } - if (inputRoot?.AccessKeyHandler != null) - { - inputRoot.AccessKeyHandler.MainMenu = this; - } + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + if (_accessKeyHandler?.MainMenu == this) + _accessKeyHandler.MainMenu = null; + + _accessKeyHandler = null; + + base.OnDetachedFromVisualTree(e); } protected internal override void PrepareContainerForItemOverride(Control element, object? item, int index)