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>
public class Menu : MenuBase, IMainMenu
{
private IAccessKeyHandler? _accessKeyHandler;
private static readonly FuncTemplate<Panel?> DefaultPanel =
new (() => new StackPanel { Orientation = Orientation.Horizontal });
@ -43,7 +45,7 @@ namespace Avalonia.Controls
AccessKeyHandler.AccessKeyPressedEvent.AddClassHandler<Menu>(OnAccessKeyPressed);
}
/// <inheritdoc/>
/// <inheritdoc cref="IMainMenu.Close"/>
public override void Close()
{
if (!IsOpen)
@ -66,7 +68,7 @@ namespace Avalonia.Controls
});
}
/// <inheritdoc/>
/// <inheritdoc cref="IMainMenu.Open"/>
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)

Loading…
Cancel
Save