From 0fb1780f75ff4fc9ec1540578206383e717855b9 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 14 Aug 2018 13:40:03 +0200 Subject: [PATCH] Don't deselect sibling item on PointerLeave. --- .../Platform/DefaultMenuInteractionHandler.cs | 15 +++++++++------ .../DefaultMenuInteractionHandlerTests.cs | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs index f65d3a4c72..3cd3094483 100644 --- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs +++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs @@ -301,17 +301,20 @@ namespace Avalonia.Controls.Platform return; } - if (item.IsTopLevel) + if (item.Parent.SelectedItem == item) { - if (!((IMenu)item.Parent).IsOpen && item.Parent.SelectedItem == item) + if (item.IsTopLevel) + { + if (!((IMenu)item.Parent).IsOpen) + { + item.Parent.SelectedItem = null; + } + } + else if (!item.HasSubMenu) { item.Parent.SelectedItem = null; } } - else if (!item.HasSubMenu) - { - item.Parent.SelectedItem = null; - } } protected internal virtual void PointerPressed(object sender, PointerPressedEventArgs e) diff --git a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs index fd4aea47a3..e17279013d 100644 --- a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs @@ -371,12 +371,30 @@ namespace Avalonia.Controls.UnitTests.Platform var item = Mock.Of(x => x.Parent == parentItem); var e = new PointerEventArgs { RoutedEvent = MenuItem.PointerLeaveItemEvent, Source = item }; + Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(item); target.PointerLeave(item, e); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null); Assert.False(e.Handled); } + [Fact] + public void PointerLeave_Doesnt_Deselect_Sibling() + { + var target = new DefaultMenuInteractionHandler(); + var menu = Mock.Of(); + var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); + var item = Mock.Of(x => x.Parent == parentItem); + var sibling = Mock.Of(x => x.Parent == parentItem); + var e = new PointerEventArgs { RoutedEvent = MenuItem.PointerLeaveItemEvent, Source = item }; + + Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(sibling); + target.PointerLeave(item, e); + + Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null, Times.Never); + Assert.False(e.Handled); + } + [Fact] public void PointerLeave_Doesnt_Deselect_Item_If_Pointer_Over_Submenu() {