From f58adf202f2e37ad3c38b668a7305388b36a35fc Mon Sep 17 00:00:00 2001 From: radoslav-radev Date: Tue, 26 Jan 2016 16:28:26 +0200 Subject: [PATCH 1/3] Add PlacementMode Center in Popup. --- src/Perspex.Controls/PlacementMode.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Perspex.Controls/PlacementMode.cs b/src/Perspex.Controls/PlacementMode.cs index a0ca30e9ad..321f8afa47 100644 --- a/src/Perspex.Controls/PlacementMode.cs +++ b/src/Perspex.Controls/PlacementMode.cs @@ -24,5 +24,10 @@ namespace Perspex.Controls /// The popup is placed at the top right of its target. /// Right, + + /// + /// The popup is placed at the center of its target. + /// + Center } } From 4ec289479b2046a53938750c41eddd5b25e1705b Mon Sep 17 00:00:00 2001 From: radoslav-radev Date: Fri, 12 Feb 2016 16:59:05 +0200 Subject: [PATCH 2/3] Add Popup PlacementMode Center: measure popup child according to placement target instead of popup root. --- src/Perspex.Controls/Primitives/Popup.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Perspex.Controls/Primitives/Popup.cs b/src/Perspex.Controls/Primitives/Popup.cs index ffa739dd70..2caa129bdc 100644 --- a/src/Perspex.Controls/Primitives/Popup.cs +++ b/src/Perspex.Controls/Primitives/Popup.cs @@ -270,7 +270,7 @@ namespace Perspex.Controls.Primitives /// Gets the position for the popup based on the placement properties. /// /// The popup's position in screen coordinates. - private Point GetPosition() + protected virtual Point GetPosition() { var zero = default(Point); var target = PlacementTarget ?? this.GetVisualParent(); @@ -283,6 +283,17 @@ namespace Perspex.Controls.Primitives return target?.PointToScreen(new Point(0, target.Bounds.Height)) ?? zero; case PlacementMode.Right: return target?.PointToScreen(new Point(target.Bounds.Width, 0)) ?? zero; + case PlacementMode.Center: + if ((target == null) || (Child == null)) + { + return zero; + } + else + { + Child.Measure(target.Bounds.Size); + + return target.PointToScreen(new Point((target.Bounds.Width - Child.DesiredSize.Width) / 2, (target.Bounds.Height - Child.DesiredSize.Height) / 2)); + } default: throw new InvalidOperationException("Invalid value for Popup.PlacementMode"); } From b3a26498cbe4e25706f1531b6ca20e923485fbdb Mon Sep 17 00:00:00 2001 From: radoslav-radev Date: Tue, 23 Feb 2016 16:32:25 +0200 Subject: [PATCH 3/3] Mame Popup GetPosition() method virtual. --- src/Perspex.Controls/PlacementMode.cs | 9 ++------- src/Perspex.Controls/Primitives/Popup.cs | 20 ++++++-------------- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/Perspex.Controls/PlacementMode.cs b/src/Perspex.Controls/PlacementMode.cs index 321f8afa47..ac366a26ec 100644 --- a/src/Perspex.Controls/PlacementMode.cs +++ b/src/Perspex.Controls/PlacementMode.cs @@ -23,11 +23,6 @@ namespace Perspex.Controls /// /// The popup is placed at the top right of its target. /// - Right, - - /// - /// The popup is placed at the center of its target. - /// - Center + Right } -} +} \ No newline at end of file diff --git a/src/Perspex.Controls/Primitives/Popup.cs b/src/Perspex.Controls/Primitives/Popup.cs index 2caa129bdc..db3f097f0f 100644 --- a/src/Perspex.Controls/Primitives/Popup.cs +++ b/src/Perspex.Controls/Primitives/Popup.cs @@ -2,13 +2,13 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Linq; using Perspex.Input; using Perspex.Interactivity; +using Perspex.LogicalTree; using Perspex.Metadata; using Perspex.Rendering; using Perspex.VisualTree; -using Perspex.LogicalTree; -using System.Linq; namespace Perspex.Controls.Primitives { @@ -279,21 +279,13 @@ namespace Perspex.Controls.Primitives { 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; - case PlacementMode.Center: - if ((target == null) || (Child == null)) - { - return zero; - } - else - { - Child.Measure(target.Bounds.Size); - - return target.PointToScreen(new Point((target.Bounds.Width - Child.DesiredSize.Width) / 2, (target.Bounds.Height - Child.DesiredSize.Height) / 2)); - } + default: throw new InvalidOperationException("Invalid value for Popup.PlacementMode"); } @@ -321,4 +313,4 @@ namespace Perspex.Controls.Primitives } } } -} +} \ No newline at end of file