From 7c0935193972cb90922a58fd2ee4f28f043e8d18 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 27 Dec 2014 22:46:19 +0000 Subject: [PATCH] Make logical tree work for TabControl. It only contains the currently visible tab - I'm not so happy about this... --- .../Collections/SingleItemPerspexList.cs | 2 +- .../Presenters/ContentPresenter.cs | 2 +- Perspex.Controls/TabControl.cs | 29 +++++++++++++++++-- Perspex.Themes.Default/TabItemStyle.cs | 2 +- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Perspex.Base/Collections/SingleItemPerspexList.cs b/Perspex.Base/Collections/SingleItemPerspexList.cs index 96a629d556..5af1e68caa 100644 --- a/Perspex.Base/Collections/SingleItemPerspexList.cs +++ b/Perspex.Base/Collections/SingleItemPerspexList.cs @@ -80,7 +80,7 @@ namespace Perspex.Collections } else { - e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, value, this.item); + e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, value, this.item, 0); this.item = value; } diff --git a/Perspex.Controls/Presenters/ContentPresenter.cs b/Perspex.Controls/Presenters/ContentPresenter.cs index 4646348df4..c0340567c3 100644 --- a/Perspex.Controls/Presenters/ContentPresenter.cs +++ b/Perspex.Controls/Presenters/ContentPresenter.cs @@ -32,7 +32,7 @@ namespace Perspex.Controls.Presenters { get { - return this.Child; + return this.child; } private set diff --git a/Perspex.Controls/TabControl.cs b/Perspex.Controls/TabControl.cs index 2790cf034e..eb9cb0eb11 100644 --- a/Perspex.Controls/TabControl.cs +++ b/Perspex.Controls/TabControl.cs @@ -11,9 +11,10 @@ namespace Perspex.Controls using System.Reactive.Linq; using Perspex.Collections; using Perspex.Controls.Generators; + using Perspex.Controls.Presenters; using Perspex.Controls.Primitives; - public class TabControl : SelectingItemsControl + public class TabControl : SelectingItemsControl, ILogical { public static readonly PerspexProperty SelectedContentProperty = PerspexProperty.Register("SelectedContent"); @@ -23,6 +24,12 @@ namespace Perspex.Controls private TabStrip tabStrip; + private ContentPresenter presenter; + + private IDisposable presenterSubscription; + + private SingleItemPerspexList logicalChild = new SingleItemPerspexList(); + public TabControl() { this.GetObservable(SelectedItemProperty).Subscribe(x => @@ -49,6 +56,11 @@ namespace Perspex.Controls private set { this.SetValue(SelectedTabProperty, value); } } + IReadOnlyPerspexList ILogical.LogicalChildren + { + get { return this.logicalChild; } + } + protected override ItemContainerGenerator CreateItemContainerGenerator() { return new TypedItemContainerGenerator(this); @@ -56,7 +68,20 @@ namespace Perspex.Controls protected override void OnTemplateApplied() { - base.OnTemplateApplied(); + if (this.presenterSubscription != null) + { + this.presenterSubscription.Dispose(); + this.presenterSubscription = null; + } + + this.presenter = this.FindTemplateChild("contentPresenter"); + + if (this.presenter != null) + { + this.presenterSubscription = this.presenter.ChildObservable + .Subscribe(x => this.logicalChild.SingleItem = x); + } + this.tabStrip = this.GetTemplateControls().OfType().FirstOrDefault(); this.BindTwoWay(TabControl.SelectedItemProperty, this.tabStrip, TabControl.SelectedItemProperty); } diff --git a/Perspex.Themes.Default/TabItemStyle.cs b/Perspex.Themes.Default/TabItemStyle.cs index 459e0df884..b3dcba8f76 100644 --- a/Perspex.Themes.Default/TabItemStyle.cs +++ b/Perspex.Themes.Default/TabItemStyle.cs @@ -41,7 +41,7 @@ namespace Perspex.Themes.Default { return new ContentPresenter { - Id = "contentPresenter", + Id = "headerPresenter", [~ContentPresenter.ContentProperty] = control[~TabItem.HeaderProperty], }; }