diff --git a/src/Perspex.Controls/ContextMenu.cs b/src/Perspex.Controls/ContextMenu.cs index bc7c785f8f..1fe6a7e04a 100644 --- a/src/Perspex.Controls/ContextMenu.cs +++ b/src/Perspex.Controls/ContextMenu.cs @@ -85,6 +85,7 @@ { _popup = new Popup() { + PlacementMode = PlacementMode.Pointer, PlacementTarget = control, StaysOpen = false }; @@ -113,6 +114,7 @@ } contextMenu._isOpen = false; + contextMenu.SelectedIndex = -1; } } diff --git a/src/Perspex.Controls/PlacementMode.cs b/src/Perspex.Controls/PlacementMode.cs index e623f31674..a0ca30e9ad 100644 --- a/src/Perspex.Controls/PlacementMode.cs +++ b/src/Perspex.Controls/PlacementMode.cs @@ -10,6 +10,11 @@ namespace Perspex.Controls /// public enum PlacementMode { + /// + /// The popup is placed at the pointer position. + /// + Pointer, + /// /// The popup is placed at the bottom left of its target. /// diff --git a/src/Perspex.Controls/Primitives/Popup.cs b/src/Perspex.Controls/Primitives/Popup.cs index 9a15a658c2..ffa739dd70 100644 --- a/src/Perspex.Controls/Primitives/Popup.cs +++ b/src/Perspex.Controls/Primitives/Popup.cs @@ -272,29 +272,19 @@ namespace Perspex.Controls.Primitives /// The popup's position in screen coordinates. private Point GetPosition() { + var zero = default(Point); var target = PlacementTarget ?? this.GetVisualParent(); - if (target != null) + switch (PlacementMode) { - Point point; - - switch (PlacementMode) - { - case PlacementMode.Bottom: - point = new Point(0, target.Bounds.Height); - break; - case PlacementMode.Right: - point = new Point(target.Bounds.Width, 0); - break; - default: - throw new InvalidOperationException("Invalid value for Popup.PlacementMode"); - } - - return target.PointToScreen(point); - } - else - { - return new Point(); + case PlacementMode.Pointer: + return MouseDevice.Instance.Position; + case PlacementMode.Bottom: + return target?.PointToScreen(new Point(0, target.Bounds.Height)) ?? zero; + case PlacementMode.Right: + return target?.PointToScreen(new Point(target.Bounds.Width, 0)) ?? zero; + default: + throw new InvalidOperationException("Invalid value for Popup.PlacementMode"); } }