diff --git a/src/Perspex.Controls/Generators/ItemContainerEventArgs.cs b/src/Perspex.Controls/Generators/ItemContainerEventArgs.cs index 86e2b890d1..0a9c3544d7 100644 --- a/src/Perspex.Controls/Generators/ItemContainerEventArgs.cs +++ b/src/Perspex.Controls/Generators/ItemContainerEventArgs.cs @@ -12,6 +12,19 @@ namespace Perspex.Controls.Generators /// public class ItemContainerEventArgs : EventArgs { + /// + /// Initializes a new instance of the class. + /// + /// The index of the first container in the source items. + /// The container. + public ItemContainerEventArgs( + int startingIndex, + ItemContainer container) + { + StartingIndex = startingIndex; + Containers = new[] { container }; + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Perspex.Controls/Generators/TreeContainerIndex.cs b/src/Perspex.Controls/Generators/TreeContainerIndex.cs index 9de4ca1050..ab07cb454d 100644 --- a/src/Perspex.Controls/Generators/TreeContainerIndex.cs +++ b/src/Perspex.Controls/Generators/TreeContainerIndex.cs @@ -1,6 +1,7 @@ // Copyright (c) The Perspex Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System; using System.Collections.Generic; namespace Perspex.Controls.Generators @@ -19,6 +20,16 @@ namespace Perspex.Controls.Generators private readonly Dictionary _itemToContainer = new Dictionary(); private readonly Dictionary _containerToItem = new Dictionary(); + /// + /// Signalled whenever new containers are materialized. + /// + public event EventHandler Materialized; + + /// + /// Event raised whenever containers are dematerialized. + /// + public event EventHandler Dematerialized; + /// /// Gets the currently materialized containers. /// @@ -33,6 +44,10 @@ namespace Perspex.Controls.Generators { _itemToContainer.Add(item, container); _containerToItem.Add(container, item); + + Materialized?.Invoke( + this, + new ItemContainerEventArgs(0, new ItemContainer(container, item, 0))); } /// @@ -44,6 +59,10 @@ namespace Perspex.Controls.Generators var item = _containerToItem[container]; _containerToItem.Remove(container); _itemToContainer.Remove(item); + + Dematerialized?.Invoke( + this, + new ItemContainerEventArgs(0, new ItemContainer(container, item, 0))); } /// diff --git a/src/Perspex.Controls/Primitives/HeaderedItemsControl.cs b/src/Perspex.Controls/Primitives/HeaderedItemsControl.cs index 5f543cae17..47d714e4da 100644 --- a/src/Perspex.Controls/Primitives/HeaderedItemsControl.cs +++ b/src/Perspex.Controls/Primitives/HeaderedItemsControl.cs @@ -51,8 +51,8 @@ namespace Perspex.Controls.Primitives /// protected override void OnTemplateApplied(TemplateAppliedEventArgs e) { - base.OnTemplateApplied(e); HeaderPresenter = e.NameScope.Find("PART_HeaderPresenter"); + base.OnTemplateApplied(e); } } } diff --git a/src/Perspex.Diagnostics/Views/TreePage.paml.cs b/src/Perspex.Diagnostics/Views/TreePage.paml.cs index 43c9829a95..3937358ba1 100644 --- a/src/Perspex.Diagnostics/Views/TreePage.paml.cs +++ b/src/Perspex.Diagnostics/Views/TreePage.paml.cs @@ -1,4 +1,5 @@ using Perspex.Controls; +using Perspex.Controls.Generators; using Perspex.Controls.Primitives; using Perspex.Controls.Shapes; using Perspex.Diagnostics.ViewModels; @@ -11,10 +12,12 @@ namespace Perspex.Diagnostics.Views public class TreePageView : UserControl { private Control _adorner; + private TreeView _tree; public TreePageView() { this.InitializeComponent(); + _tree.ItemContainerGenerator.Index.Materialized += TreeViewItemMaterialized; } protected void AddAdorner(object sender, PointerEventArgs e) @@ -46,6 +49,22 @@ namespace Perspex.Diagnostics.Views private void InitializeComponent() { PerspexXamlLoader.Load(this); + _tree = this.FindControl("tree"); + } + + private void TreeViewItemMaterialized(object sender, ItemContainerEventArgs e) + { + var item = (TreeViewItem)e.Containers[0].ContainerControl; + item.TemplateApplied += TreeViewItemTemplateApplied; + } + + private void TreeViewItemTemplateApplied(object sender, TemplateAppliedEventArgs e) + { + var item = (TreeViewItem)sender; + var header = item.HeaderPresenter.Child; + header.PointerEnter += AddAdorner; + header.PointerLeave += RemoveAdorner; + item.TemplateApplied -= TreeViewItemTemplateApplied; } } }