Browse Source

Display context menu at pointer position.

pull/413/head
Steven Kirk 11 years ago
parent
commit
0dd742ada3
  1. 2
      src/Perspex.Controls/ContextMenu.cs
  2. 5
      src/Perspex.Controls/PlacementMode.cs
  3. 30
      src/Perspex.Controls/Primitives/Popup.cs

2
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;
}
}

5
src/Perspex.Controls/PlacementMode.cs

@ -10,6 +10,11 @@ namespace Perspex.Controls
/// </summary>
public enum PlacementMode
{
/// <summary>
/// The popup is placed at the pointer position.
/// </summary>
Pointer,
/// <summary>
/// The popup is placed at the bottom left of its target.
/// </summary>

30
src/Perspex.Controls/Primitives/Popup.cs

@ -272,29 +272,19 @@ namespace Perspex.Controls.Primitives
/// <returns>The popup's position in screen coordinates.</returns>
private Point GetPosition()
{
var zero = default(Point);
var target = PlacementTarget ?? this.GetVisualParent<Control>();
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");
}
}

Loading…
Cancel
Save