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)