diff --git a/Perspex.Base/Perspex.Base.csproj b/Perspex.Base/Perspex.Base.csproj index e05c4172a8..53f67bda25 100644 --- a/Perspex.Base/Perspex.Base.csproj +++ b/Perspex.Base/Perspex.Base.csproj @@ -38,6 +38,7 @@ + diff --git a/Perspex.Controls/Popup.cs b/Perspex.Controls/Popup.cs index eaa0e98567..9b71c7aa7a 100644 --- a/Perspex.Controls/Popup.cs +++ b/Perspex.Controls/Popup.cs @@ -12,7 +12,7 @@ namespace Perspex.Controls using Perspex.Rendering; using Perspex.VisualTree; - public class Popup : Control, ILogical + public class Popup : Control, ILogical, IVisualTreeHost { public static readonly PerspexProperty ChildProperty = PerspexProperty.Register("Child"); @@ -80,6 +80,11 @@ namespace Perspex.Controls get { return this.logicalChild; } } + IVisual IVisualTreeHost.Root + { + get { return this.popupRoot; } + } + public void Open() { if (this.popupRoot == null) diff --git a/Perspex.Diagnostics/ViewModels/TreeNode.cs b/Perspex.Diagnostics/ViewModels/TreeNode.cs index 3b45546b36..ba88624fcd 100644 --- a/Perspex.Diagnostics/ViewModels/TreeNode.cs +++ b/Perspex.Diagnostics/ViewModels/TreeNode.cs @@ -36,7 +36,7 @@ namespace Perspex.Diagnostics.ViewModels }); } - public IReactiveDerivedList Children + public IReadOnlyReactiveList Children { get; protected set; diff --git a/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs b/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs index 6e41af692f..6961e09add 100644 --- a/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs +++ b/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs @@ -7,6 +7,7 @@ namespace Perspex.Diagnostics.ViewModels { using Perspex.Controls; + using Perspex.VisualTree; using ReactiveUI; internal class VisualTreeNode : TreeNode @@ -14,7 +15,16 @@ namespace Perspex.Diagnostics.ViewModels public VisualTreeNode(IVisual visual) : base((Control)visual) { - this.Children = visual.VisualChildren.CreateDerivedCollection(x => new VisualTreeNode(x)); + var host = visual as IVisualTreeHost; + + if (host == null || host.Root == null) + { + this.Children = visual.VisualChildren.CreateDerivedCollection(x => new VisualTreeNode(x)); + } + else + { + this.Children = new ReactiveList(new[] { new VisualTreeNode(host.Root) }); + } if (this.Control != null) { diff --git a/Perspex.SceneGraph/Perspex.SceneGraph.csproj b/Perspex.SceneGraph/Perspex.SceneGraph.csproj index 516128eeec..1e5c759905 100644 --- a/Perspex.SceneGraph/Perspex.SceneGraph.csproj +++ b/Perspex.SceneGraph/Perspex.SceneGraph.csproj @@ -100,6 +100,7 @@ + diff --git a/Perspex.SceneGraph/VisualTree/IVisualTreeHost.cs b/Perspex.SceneGraph/VisualTree/IVisualTreeHost.cs new file mode 100644 index 0000000000..020c4420c9 --- /dev/null +++ b/Perspex.SceneGraph/VisualTree/IVisualTreeHost.cs @@ -0,0 +1,22 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2015 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.VisualTree +{ + /// + /// Interface for controls that host their own separate visual tree, such as popups. + /// + public interface IVisualTreeHost + { + /// + /// Gets the root of the hosted visual tree. + /// + /// + /// The root of the hosted visual tree. + /// + IVisual Root { get; } + } +}