Browse Source

Fix menu memory leak (#20753)

* Add test for menu memory leak

* Fix menu memory leak
release/11.3.13
Julien Lebosquain 8 months ago
parent
commit
f5e771d497
No known key found for this signature in database GPG Key ID: 1833CAD10ACC46FD
  1. 23
      src/Avalonia.Controls/Menu.cs

23
src/Avalonia.Controls/Menu.cs

@ -13,6 +13,8 @@ namespace Avalonia.Controls
/// </summary> /// </summary>
public class Menu : MenuBase, IMainMenu public class Menu : MenuBase, IMainMenu
{ {
private IAccessKeyHandler? _accessKeyHandler;
private static readonly FuncTemplate<Panel?> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new (() => new StackPanel { Orientation = Orientation.Horizontal }); new (() => new StackPanel { Orientation = Orientation.Horizontal });
@ -43,7 +45,7 @@ namespace Avalonia.Controls
AccessKeyHandler.AccessKeyPressedEvent.AddClassHandler<Menu>(OnAccessKeyPressed); AccessKeyHandler.AccessKeyPressedEvent.AddClassHandler<Menu>(OnAccessKeyPressed);
} }
/// <inheritdoc/> /// <inheritdoc cref="IMainMenu.Close"/>
public override void Close() public override void Close()
{ {
if (!IsOpen) if (!IsOpen)
@ -66,7 +68,7 @@ namespace Avalonia.Controls
}); });
} }
/// <inheritdoc/> /// <inheritdoc cref="IMainMenu.Open"/>
public override void Open() public override void Open()
{ {
if (IsOpen) if (IsOpen)
@ -88,12 +90,19 @@ namespace Avalonia.Controls
{ {
base.OnAttachedToVisualTree(e); 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) protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{ {
inputRoot.AccessKeyHandler.MainMenu = this; if (_accessKeyHandler?.MainMenu == this)
} _accessKeyHandler.MainMenu = null;
_accessKeyHandler = null;
base.OnDetachedFromVisualTree(e);
} }
protected internal override void PrepareContainerForItemOverride(Control element, object? item, int index) protected internal override void PrepareContainerForItemOverride(Control element, object? item, int index)

Loading…
Cancel
Save