// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex.Controls.Primitives { using System; using System.Linq; using System.Reactive.Linq; using Perspex.Controls.Generators; public class TabStrip : SelectingItemsControl { public static readonly PerspexProperty SelectedTabProperty = TabControl.SelectedTabProperty.AddOwner(); private static readonly ItemsPanelTemplate PanelTemplate = new ItemsPanelTemplate( () => new StackPanel()); static TabStrip() { FocusableProperty.OverrideDefaultValue(typeof(TabStrip), false); ItemsPanelProperty.OverrideDefaultValue(typeof(TabStrip), PanelTemplate); } public TabStrip() { this.GetObservable(SelectedItemProperty).Subscribe(x => this.SelectedTab = x as TabItem); this.GetObservable(SelectedTabProperty).Subscribe(x => this.SelectedItem = x as TabItem); } public TabItem SelectedTab { get { return this.GetValue(SelectedTabProperty); } set { this.SetValue(SelectedTabProperty, value); } } protected override ItemContainerGenerator CreateItemContainerGenerator() { TabControl tabControl = this.TemplatedParent as TabControl; ItemContainerGenerator result; if (tabControl != null) { result = tabControl.ItemContainerGenerator; } else { result = new TypedItemContainerGenerator(this); } result.StateChanged += this.ItemsContainerGeneratorStateChanged; return result; } private void ItemsContainerGeneratorStateChanged(object sender, EventArgs e) { if (this.ItemContainerGenerator.State == ItemContainerGeneratorState.Generated) { var tabs = this.ItemContainerGenerator.GetAll() .Select(x => x.Item2) .OfType() .ToList(); this.SelectedItem = tabs.FirstOrDefault(x => x.IsSelected) ?? tabs.FirstOrDefault(); } } } }