Browse Source

Added Popup.PlacementMode.

Hacky: only supports Bottom and Right so far, and doesn't take into
account screen edges etc.
pull/58/head
Steven Kirk 12 years ago
parent
commit
0048460b88
  1. 1
      Perspex.Controls/Perspex.Controls.csproj
  2. 14
      Perspex.Controls/PlacementMode.cs
  3. 29
      Perspex.Controls/Popup.cs
  4. 1
      Perspex.Themes.Default/MenuItemStyle.cs

1
Perspex.Controls/Perspex.Controls.csproj

@ -50,6 +50,7 @@
<Compile Include="Deck.cs" />
<Compile Include="Platform\IPopupImpl.cs" />
<Compile Include="Platform\ITopLevelImpl.cs" />
<Compile Include="PlacementMode.cs" />
<Compile Include="Popup.cs" />
<Compile Include="IDataTemplate.cs" />
<Compile Include="Presenters\IItemsPresenter.cs" />

14
Perspex.Controls/PlacementMode.cs

@ -0,0 +1,14 @@
// -----------------------------------------------------------------------
// <copyright file="PlacementMode.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
public enum PlacementMode
{
Bottom,
Right,
}
}

29
Perspex.Controls/Popup.cs

@ -10,6 +10,7 @@ namespace Perspex.Controls
using Perspex.Interactivity;
using Perspex.Platform;
using Perspex.Rendering;
using Perspex.VisualTree;
public class Popup : Control
{
@ -19,6 +20,9 @@ namespace Perspex.Controls
public static readonly PerspexProperty<bool> IsOpenProperty =
PerspexProperty.Register<Popup, bool>("IsOpen");
public static readonly PerspexProperty<PlacementMode> PlacementModeProperty =
PerspexProperty.Register<Popup, PlacementMode>("PlacementMode", defaultValue: PlacementMode.Bottom);
public static readonly PerspexProperty<Control> PlacementTargetProperty =
PerspexProperty.Register<Popup, Control>("PlacementTarget");
@ -61,6 +65,12 @@ namespace Perspex.Controls
set { this.SetValue(IsOpenProperty, value); }
}
public PlacementMode PlacementMode
{
get { return this.GetValue(PlacementModeProperty); }
set { this.SetValue(PlacementModeProperty, value); }
}
public Control PlacementTarget
{
get { return this.GetValue(PlacementTargetProperty); }
@ -130,9 +140,24 @@ namespace Perspex.Controls
private Point GetPosition()
{
if (this.PlacementTarget != null)
var target = this.PlacementTarget ?? this.GetVisualParent<Control>();
Point point;
switch (this.PlacementMode)
{
case PlacementMode.Bottom:
point = target.Bounds.BottomLeft;
break;
case PlacementMode.Right:
point = target.Bounds.TopRight;
break;
default:
throw new InvalidOperationException("Invalid value for Popup.PlacementMode");
}
if (target != null)
{
return this.PlacementTarget.PointToScreen(new Point(0, this.PlacementTarget.Bounds.Size.Height));
return target.PointToScreen(point);
}
else
{

1
Perspex.Themes.Default/MenuItemStyle.cs

@ -188,6 +188,7 @@ namespace Perspex.Themes.Default
(popup = new Popup
{
Name = "popup",
PlacementMode = PlacementMode.Right,
StaysOpen = true,
[!!Popup.IsOpenProperty] = control[!!MenuItem.IsSubMenuOpenProperty],
Child = new Border

Loading…
Cancel
Save