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");
}
}