From 645ca8555fc676d821f7dc06779da334e75ccd82 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 15 Dec 2023 21:26:26 +0100 Subject: [PATCH] Don't override Placement when Open called in code. (#13967) #6059 changed `ContextMenu.Open` to open the context menu at the bottom of the control when the `ContextRequestedEventArgs` doesn't contain a position, however it also had the side-effect of preventing the `Placement` property from being respected when opening a `ContextMenu` from code. Change the private `Open` method to accept a `PlacementMode` instead of a boolean flag, and only pass `Bottom` here when `ContextRequestedEventArgs` has no requested position. Fixes #12504 --- src/Avalonia.Controls/ContextMenu.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Controls/ContextMenu.cs b/src/Avalonia.Controls/ContextMenu.cs index b3dabd8ab9..7bfe283d40 100644 --- a/src/Avalonia.Controls/ContextMenu.cs +++ b/src/Avalonia.Controls/ContextMenu.cs @@ -265,7 +265,7 @@ namespace Avalonia.Controls } control ??= _attachedControls![0]; - Open(control, PlacementTarget ?? control, false); + Open(control, PlacementTarget ?? control, Placement); } /// @@ -303,7 +303,7 @@ namespace Avalonia.Controls remove => _popupHostChangedHandler -= value; } - private void Open(Control control, Control placementTarget, bool requestedByPointer) + private void Open(Control control, Control placementTarget, PlacementMode placement) { if (IsOpen) { @@ -330,9 +330,7 @@ namespace Avalonia.Controls ((ISetLogicalParent)_popup).SetParent(control); } - _popup.Placement = !requestedByPointer && Placement == PlacementMode.Pointer - ? PlacementMode.Bottom - : Placement; + _popup.Placement = placement; //Position of the line below is really important. //All styles are being applied only when control has logical parent. @@ -420,7 +418,10 @@ namespace Avalonia.Controls && !contextMenu.CancelOpening()) { var requestedByPointer = e.TryGetPosition(null, out _); - contextMenu.Open(control, e.Source as Control ?? control, requestedByPointer); + contextMenu.Open( + control, + e.Source as Control ?? control, + requestedByPointer ? contextMenu.Placement : PlacementMode.Bottom); e.Handled = true; } }