From 033c686456f169e4b2ea61aa8ca4f93f826d5373 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sun, 30 Nov 2014 17:03:59 +0100 Subject: [PATCH] Added ScrollViewer to TreeViewStyle. --- .../Presenters/ContentPresenter.cs | 19 ++++++++- Perspex.Controls/Presenters/ItemsPresenter.cs | 41 ++++++++++--------- Perspex.Themes.Default/TreeViewStyle.cs | 9 ++-- 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/Perspex.Controls/Presenters/ContentPresenter.cs b/Perspex.Controls/Presenters/ContentPresenter.cs index fc41d758a2..855591adef 100644 --- a/Perspex.Controls/Presenters/ContentPresenter.cs +++ b/Perspex.Controls/Presenters/ContentPresenter.cs @@ -30,6 +30,16 @@ namespace Perspex.Controls.Presenters set { this.SetValue(ContentProperty, value); } } + protected override Size MeasureCore(Size availableSize) + { + if (!this.createdChild) + { + this.CreateChild(); + } + + return base.MeasureCore(availableSize); + } + protected override Size MeasureOverride(Size availableSize) { if (!this.createdChild) @@ -85,7 +95,14 @@ namespace Perspex.Controls.Presenters } } - result.TemplatedParent = null; + var foo = this.TemplatedParent as TemplatedControl; + + if (foo != null) + { + foo = foo.TemplatedParent as TemplatedControl; + } + + result.TemplatedParent = foo; this.AddVisualChild(result); } diff --git a/Perspex.Controls/Presenters/ItemsPresenter.cs b/Perspex.Controls/Presenters/ItemsPresenter.cs index 2fd507830d..bd4e7ead66 100644 --- a/Perspex.Controls/Presenters/ItemsPresenter.cs +++ b/Perspex.Controls/Presenters/ItemsPresenter.cs @@ -63,8 +63,8 @@ namespace Perspex.Controls.Presenters this.ClearVisualChildren(); this.panel = this.ItemsPanel.Build(); this.AddVisualChild(this.panel); - this.ItemsChanged(Tuple.Create(default(IEnumerable), this.Items)); this.createdPanel = true; + this.ItemsChanged(Tuple.Create(default(IEnumerable), this.Items)); } private IItemContainerGenerator GetGenerator() @@ -81,31 +81,34 @@ namespace Perspex.Controls.Presenters private void ItemsChanged(Tuple value) { - var generator = this.GetGenerator(); - - if (value.Item1 != null) + if (this.createdPanel) { - this.panel.Children.RemoveAll(generator.Remove(value.Item1)); - - INotifyCollectionChanged incc = value.Item1 as INotifyCollectionChanged; + var generator = this.GetGenerator(); - if (incc != null) + if (value.Item1 != null) { - incc.CollectionChanged -= this.ItemsCollectionChanged; + this.panel.Children.RemoveAll(generator.Remove(value.Item1)); + + INotifyCollectionChanged incc = value.Item1 as INotifyCollectionChanged; + + if (incc != null) + { + incc.CollectionChanged -= this.ItemsCollectionChanged; + } } - } - if (this.panel != null) - { - if (value.Item2 != null) + if (this.panel != null) { - this.panel.Children.AddRange(generator.Generate(this.Items)); + if (value.Item2 != null) + { + this.panel.Children.AddRange(generator.Generate(this.Items)); - INotifyCollectionChanged incc = value.Item2 as INotifyCollectionChanged; + INotifyCollectionChanged incc = value.Item2 as INotifyCollectionChanged; - if (incc != null) - { - incc.CollectionChanged += this.ItemsCollectionChanged; + if (incc != null) + { + incc.CollectionChanged += this.ItemsCollectionChanged; + } } } } @@ -113,7 +116,7 @@ namespace Perspex.Controls.Presenters private void ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { - if (this.panel != null) + if (this.createdPanel) { var generator = this.GetGenerator(); diff --git a/Perspex.Themes.Default/TreeViewStyle.cs b/Perspex.Themes.Default/TreeViewStyle.cs index 6c55de912a..76f6a32c15 100644 --- a/Perspex.Themes.Default/TreeViewStyle.cs +++ b/Perspex.Themes.Default/TreeViewStyle.cs @@ -38,10 +38,13 @@ namespace Perspex.Themes.Default [~Border.BackgroundProperty] = control[~TreeView.BackgroundProperty], [~Border.BorderBrushProperty] = control[~TreeView.BorderBrushProperty], [~Border.BorderThicknessProperty] = control[~TreeView.BorderThicknessProperty], - Content = new ItemsPresenter + Content = new ScrollViewer { - [~ItemsPresenter.ItemsProperty] = control[~TreeView.ItemsProperty], - [~ItemsPresenter.ItemsPanelProperty] = control[~TreeView.ItemsPanelProperty], + Content = new ItemsPresenter + { + [~ItemsPresenter.ItemsProperty] = control[~TreeView.ItemsProperty], + [~ItemsPresenter.ItemsPanelProperty] = control[~TreeView.ItemsPanelProperty], + } } }; }