Skip to content

Commit 761edc1

Browse files
committed
Merge pull request AvaloniaUI#8172 from AvaloniaUI/make-menu-selection-logic-consistant-with-other-frameworks
Fix Menu selection to match UWP. # Conflicts: # src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs
1 parent 7c1fc90 commit 761edc1

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public virtual void Attach(IMenu menu)
5555
Menu.AddHandler(Avalonia.Controls.Menu.MenuOpenedEvent, this.MenuOpened);
5656
Menu.AddHandler(MenuItem.PointerEnterItemEvent, PointerEnter);
5757
Menu.AddHandler(MenuItem.PointerLeaveItemEvent, PointerLeave);
58+
Menu.AddHandler(InputElement.PointerMovedEvent, PointerMoved);
5859

5960
_root = Menu.VisualRoot;
6061

@@ -90,6 +91,7 @@ public virtual void Detach(IMenu menu)
9091
Menu.RemoveHandler(Avalonia.Controls.Menu.MenuOpenedEvent, this.MenuOpened);
9192
Menu.RemoveHandler(MenuItem.PointerEnterItemEvent, PointerEnter);
9293
Menu.RemoveHandler(MenuItem.PointerLeaveItemEvent, PointerLeave);
94+
Menu.RemoveHandler(InputElement.PointerMovedEvent, PointerMoved);
9395

9496
if (_root is InputElement inputRoot)
9597
{
@@ -333,7 +335,23 @@ protected internal virtual void PointerEnter(object sender, PointerEventArgs e)
333335
}
334336
}
335337

336-
protected internal virtual void PointerLeave(object sender, PointerEventArgs e)
338+
protected internal virtual void PointerMoved(object? sender, PointerEventArgs e)
339+
{
340+
// HACK: #8179 needs to be addressed to correctly implement it in the PointerPressed method.
341+
var item = GetMenuItem(e.Source as IControl) as MenuItem;
342+
if (item?.TransformedBounds == null)
343+
{
344+
return;
345+
}
346+
var point = e.GetCurrentPoint(null);
347+
348+
if (point.Properties.IsLeftButtonPressed && item.TransformedBounds.Value.Contains(point.Position) == false)
349+
{
350+
e.Pointer.Capture(null);
351+
}
352+
}
353+
354+
protected internal virtual void PointerLeave(object? sender, PointerEventArgs e)
337355
{
338356
var item = GetMenuItem(e.Source as IControl);
339357

0 commit comments

Comments
 (0)