From c4433369281c6aaed7d2b7278dc07f5fb76764bc Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 4 Apr 2020 19:48:06 +0200 Subject: [PATCH] Fix leaks in attached context menu, --- src/Avalonia.Controls/ContextMenu.cs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/ContextMenu.cs b/src/Avalonia.Controls/ContextMenu.cs index 61e4b69c9b..bb9b853c28 100644 --- a/src/Avalonia.Controls/ContextMenu.cs +++ b/src/Avalonia.Controls/ContextMenu.cs @@ -20,7 +20,7 @@ namespace Avalonia.Controls private static readonly ITemplate DefaultPanel = new FuncTemplate(() => new StackPanel { Orientation = Orientation.Vertical }); private Popup _popup; - private bool _attachedToControl; + private Control _attachedControl; private IInputElement _previousFocus; /// @@ -74,12 +74,13 @@ namespace Avalonia.Controls if (e.OldValue is ContextMenu oldMenu) { control.PointerReleased -= ControlPointerReleased; - oldMenu._attachedToControl = false; + oldMenu._attachedControl = null; + ((ISetLogicalParent)oldMenu._popup).SetParent(null); } if (e.NewValue is ContextMenu newMenu) { - newMenu._attachedToControl = true; + newMenu._attachedControl = control; control.PointerReleased += ControlPointerReleased; } } @@ -95,8 +96,18 @@ namespace Avalonia.Controls /// The control. public void Open(Control control) { - if (control == null) + if (control is null && _attachedControl is null) + { throw new ArgumentNullException(nameof(control)); + } + + if (control is object && _attachedControl is object && control != _attachedControl) + { + throw new ArgumentException( + "Cannot show ContentMenu on a different control to the one it is attached to.", + nameof(control)); + } + if (IsOpen) { return; @@ -168,7 +179,7 @@ namespace Avalonia.Controls SelectedIndex = -1; IsOpen = false; - if (!_attachedToControl) + if (_attachedControl is null) { ((ISetLogicalParent)_popup).SetParent(null); }