From 9d5e6338789dfd7237d40b15198f6de5be2ac9e7 Mon Sep 17 00:00:00 2001 From: Tako <53405089+Takoooooo@users.noreply.github.com> Date: Fri, 5 Nov 2021 10:41:55 +0200 Subject: [PATCH] Merge pull request #6818 from simonhaines/fixes/6412-disabled-menu-items Filter pointer pressed events from disabled sub-menu items --- .../Platform/DefaultMenuInteractionHandler.cs | 6 +++++- .../DefaultMenuInteractionHandlerTests.cs | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs index f9fe50026e..c228a7887f 100644 --- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs +++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs @@ -1,4 +1,5 @@ using System; +using Avalonia.Controls.Primitives; using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Interactivity; @@ -376,7 +377,10 @@ namespace Avalonia.Controls.Platform { if (item.IsSubMenuOpen) { - if (item.IsTopLevel) + // PointerPressed events may bubble from disabled items in sub-menus. In this case, + // keep the sub-menu open. + var popup = (e.Source as ILogical)?.FindLogicalAncestorOfType(); + if (item.IsTopLevel && popup == null) { CloseMenu(item); } diff --git a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs index 1a11091b81..9eedd17716 100644 --- a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs @@ -1,5 +1,6 @@ using System; using Avalonia.Controls.Platform; +using Avalonia.Controls.Primitives; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.VisualTree; @@ -540,6 +541,22 @@ namespace Avalonia.Controls.UnitTests.Platform Mock.Get(item).Verify(x => x.MoveSelection(NavigationDirection.First, true), Times.Never); Assert.True(e.Handled); } + + [Fact] + public void PointerPressed_On_Disabled_Item_Doesnt_Close_SubMenu() + { + var target = new DefaultMenuInteractionHandler(false); + var menu = Mock.Of(); + var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.IsSubMenuOpen == true && x.Parent == menu); + var popup = new Popup(); + var e = CreatePressed(popup); + + ((ISetLogicalParent)popup).SetParent(parentItem); + target.PointerPressed(parentItem, e); + + Mock.Get(parentItem).Verify(x => x.Close(), Times.Never); + Assert.True(e.Handled); + } } public class ContextMenu