Browse Source

fixed to popup to work on logical tree.

danwalmsley 9 years ago
parent
commit
f7de57f46f
2 changed files with 17 additions and 10 deletions
  1. 1 1
      src/Perspex.Controls/ContextMenu.cs
  2. 16 9
      src/Perspex.Controls/Primitives/Popup.cs

+ 1 - 1
src/Perspex.Controls/ContextMenu.cs

@@ -88,7 +88,7 @@
                 {
                     _popup = new Popup()
                     {
-                        [Popup.PlacementTargetProperty] = control,
+                        PlacementTarget = control,
                         Child = new ContentControl(),
                     };
                 }

+ 16 - 9
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
         }
 
         /// <inheritdoc/>
-        protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
+        protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
         {
-            base.OnAttachedToVisualTree(e);
+            base.OnAttachedToLogicalTree(e);
             _topLevel = e.Root as TopLevel;
         }
 
         /// <inheritdoc/>
-        protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
+        protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
         {
-            base.OnDetachedFromVisualTree(e);
             _topLevel = null;
         }