From f7de57f46f855a5d9bbfbafb293d2788f28d0131 Mon Sep 17 00:00:00 2001 From: danwalmsley Date: Thu, 4 Feb 2016 17:06:52 +0000 Subject: [PATCH] fixed to popup to work on logical tree. --- src/Perspex.Controls/ContextMenu.cs | 2 +- src/Perspex.Controls/Primitives/Popup.cs | 25 +++++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Perspex.Controls/ContextMenu.cs b/src/Perspex.Controls/ContextMenu.cs index 992e7a2c12..b59df2fe7d 100644 --- a/src/Perspex.Controls/ContextMenu.cs +++ b/src/Perspex.Controls/ContextMenu.cs @@ -88,7 +88,7 @@ { _popup = new Popup() { - [Popup.PlacementTargetProperty] = control, + PlacementTarget = control, Child = new ContentControl(), }; } diff --git a/src/Perspex.Controls/Primitives/Popup.cs b/src/Perspex.Controls/Primitives/Popup.cs index 2c4dd05745..059e782584 100644 --- a/src/Perspex.Controls/Primitives/Popup.cs +++ b/src/Perspex.Controls/Primitives/Popup.cs @@ -7,6 +7,8 @@ using Perspex.Interactivity; using Perspex.Metadata; using Perspex.Rendering; using Perspex.VisualTree; +using Perspex.LogicalTree; +using System.Linq; namespace Perspex.Controls.Primitives { @@ -170,12 +172,14 @@ namespace Perspex.Controls.Primitives _popupRoot.Position = GetPosition(); - if (_topLevel != null) + if (_topLevel == null) { - _topLevel.Deactivated += TopLevelDeactivated; - _topLevel.AddHandler(PointerPressedEvent, PointerPressedOutside, RoutingStrategies.Tunnel); + _topLevel = PlacementTarget.GetSelfAndLogicalAncestors().First(x => x is TopLevel) as TopLevel; } + _topLevel.Deactivated += TopLevelDeactivated; + _topLevel.AddHandler(PointerPressedEvent, PointerPressedOutside, RoutingStrategies.Tunnel); + PopupRootCreated?.Invoke(this, EventArgs.Empty); _popupRoot.Show(); @@ -190,8 +194,12 @@ namespace Perspex.Controls.Primitives { if (_popupRoot != null) { - _topLevel.RemoveHandler(PointerPressedEvent, PointerPressedOutside); - _topLevel.Deactivated -= TopLevelDeactivated; + if (_topLevel != null) + { + _topLevel.RemoveHandler(PointerPressedEvent, PointerPressedOutside); + _topLevel.Deactivated -= TopLevelDeactivated; + } + _popupRoot.Hide(); } @@ -210,16 +218,15 @@ namespace Perspex.Controls.Primitives } /// - protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) { - base.OnAttachedToVisualTree(e); + base.OnAttachedToLogicalTree(e); _topLevel = e.Root as TopLevel; } /// - protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) { - base.OnDetachedFromVisualTree(e); _topLevel = null; }