diff --git a/Perspex/Controls/Control.cs b/Perspex/Controls/Control.cs index bae326402d..6cad776216 100644 --- a/Perspex/Controls/Control.cs +++ b/Perspex/Controls/Control.cs @@ -212,8 +212,15 @@ namespace Perspex.Controls }); } - protected DataTemplate FindDataTemplate(object content) + protected virtual DataTemplate FindDataTemplate(object content) { + IVisual visual = content as IVisual; + + if (visual != null) + { + return new DataTemplate(_ => true, x => visual); + } + ILogical node = this; while (node != null) diff --git a/Perspex/Controls/HeaderedContentControl.cs b/Perspex/Controls/HeaderedContentControl.cs new file mode 100644 index 0000000000..047698d62c --- /dev/null +++ b/Perspex/Controls/HeaderedContentControl.cs @@ -0,0 +1,43 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Controls +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public class HeaderedContentControl : ContentControl, ILogical, IHeadered + { + public static readonly PerspexProperty HeaderProperty = + PerspexProperty.Register("Header"); + + public object Header + { + get { return this.GetValue(HeaderProperty); } + set { this.SetValue(HeaderProperty, value); } + } + + IEnumerable ILogical.LogicalChildren + { + get + { + ILogical logicalContent = this.Content as ILogical; + ILogical logicalHeader = this.Header as ILogical; + + if (logicalContent != null) + { + yield return logicalContent; + } + + if (logicalHeader != null) + { + yield return logicalHeader; + } + } + } + } +} diff --git a/Perspex/Controls/ItemsPresenter.cs b/Perspex/Controls/ItemsPresenter.cs index 0a1e40fd1e..9ba460c2af 100644 --- a/Perspex/Controls/ItemsPresenter.cs +++ b/Perspex/Controls/ItemsPresenter.cs @@ -15,10 +15,10 @@ namespace Perspex.Controls public class ItemsPresenter : Control, IVisual { public static readonly PerspexProperty ItemsProperty = - PerspexProperty.Register("Items"); + PerspexProperty.Register("Items"); public static readonly PerspexProperty ItemsPanelProperty = - PerspexProperty.Register("ItemsPanel"); + PerspexProperty.Register("ItemsPanel"); private Panel panel; diff --git a/Perspex/Controls/Tab.cs b/Perspex/Controls/Tab.cs new file mode 100644 index 0000000000..537b5874be --- /dev/null +++ b/Perspex/Controls/Tab.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Perspex.Controls +{ + public class Tab : ContentControl + { + } +} diff --git a/Perspex/Controls/TabStrip.cs b/Perspex/Controls/TabStrip.cs new file mode 100644 index 0000000000..4041b384a8 --- /dev/null +++ b/Perspex/Controls/TabStrip.cs @@ -0,0 +1,27 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Controls +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public class TabStrip : ItemsControl + { + private static readonly DataTemplate TabTemplate = new DataTemplate(_ => true, CreateTab); + + protected override DataTemplate FindDataTemplate(object content) + { + return TabTemplate; + } + + private static IVisual CreateTab(object o) + { + return new Tab { Content = o }; + } + } +} diff --git a/Perspex/IHeadered.cs b/Perspex/IHeadered.cs new file mode 100644 index 0000000000..38ee042a53 --- /dev/null +++ b/Perspex/IHeadered.cs @@ -0,0 +1,13 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex +{ + public interface IHeadered + { + object Header { get; set; } + } +} diff --git a/Perspex/Perspex.csproj b/Perspex/Perspex.csproj index 0aca902794..9c5ef2371b 100644 --- a/Perspex/Perspex.csproj +++ b/Perspex/Perspex.csproj @@ -70,6 +70,9 @@ + + + @@ -90,6 +93,7 @@ + @@ -128,6 +132,8 @@ + + diff --git a/Perspex/Themes/Default/DefaultTheme.cs b/Perspex/Themes/Default/DefaultTheme.cs index 94431c0c0d..256d8acdee 100644 --- a/Perspex/Themes/Default/DefaultTheme.cs +++ b/Perspex/Themes/Default/DefaultTheme.cs @@ -17,7 +17,8 @@ namespace Perspex.Themes.Default this.Add(new ContentControlStyle()); this.Add(new ItemsControlStyle()); this.Add(new TextBoxStyle()); - this.Add(new ItemsControlStyle()); + this.Add(new TabStyle()); + this.Add(new TabStripStyle()); } } } diff --git a/Perspex/Themes/Default/ItemsControlStyle.cs b/Perspex/Themes/Default/ItemsControlStyle.cs index 06172a3595..396c6f7802 100644 --- a/Perspex/Themes/Default/ItemsControlStyle.cs +++ b/Perspex/Themes/Default/ItemsControlStyle.cs @@ -6,11 +6,8 @@ namespace Perspex.Themes.Default { - using System; using System.Linq; using Perspex.Controls; - using Perspex.Media; - using Perspex.Shapes; using Perspex.Styling; public class ItemsControlStyle : Styles diff --git a/Perspex/Themes/Default/TabStripStyle.cs b/Perspex/Themes/Default/TabStripStyle.cs new file mode 100644 index 0000000000..e7ed4176fe --- /dev/null +++ b/Perspex/Themes/Default/TabStripStyle.cs @@ -0,0 +1,39 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Themes.Default +{ + using System.Linq; + using Perspex.Controls; + using Perspex.Media; + using Perspex.Styling; + + public class TabStripStyle : Styles + { + public TabStripStyle() + { + this.AddRange(new[] + { + new Style(x => x.OfType()) + { + Setters = new[] + { + new Setter(Button.TemplateProperty, ControlTemplate.Create(this.Template)), + }, + }, + }); + } + + private Control Template(TabStrip control) + { + return new ItemsPresenter + { + ItemsPanel = new ItemsPanelTemplate(() => new StackPanel()), + [~ItemsPresenter.ItemsProperty] = control[~ItemsControl.ItemsProperty], + }; + } + } +} diff --git a/Perspex/Themes/Default/TabStyle.cs b/Perspex/Themes/Default/TabStyle.cs new file mode 100644 index 0000000000..f0a6be8e96 --- /dev/null +++ b/Perspex/Themes/Default/TabStyle.cs @@ -0,0 +1,42 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Themes.Default +{ + using System.Linq; + using Perspex.Controls; + using Perspex.Media; + using Perspex.Styling; + + public class TabStyle : Styles + { + public TabStyle() + { + this.AddRange(new[] + { + new Style(x => x.OfType()) + { + Setters = new[] + { + new Setter(Button.TemplateProperty, ControlTemplate.Create(this.Template)), + }, + }, + }); + } + + private Control Template(Tab control) + { + return new Border + { + Background = Brushes.Red, + Content = new ContentPresenter + { + [~ContentPresenter.ContentProperty] = control[~Tab.ContentProperty], + } + }; + } + } +} diff --git a/TestApplication/Program.cs b/TestApplication/Program.cs index 6ddd75dad9..74d160b3b1 100644 --- a/TestApplication/Program.cs +++ b/TestApplication/Program.cs @@ -70,37 +70,13 @@ namespace TestApplication Source = new Bitmap("github_icon.png"), Width = 200, }, - new ItemsControl + new TabStrip { - DataTemplates = new DataTemplates - { - new DataTemplate(o => new Border - { - Background = Brushes.Red, - BorderBrush = Brushes.Black, - BorderThickness = 1, - Content = new StackPanel - { - Orientation = Orientation.Vertical, - Children = new PerspexList - { - new TextBlock - { - Text = o.Name, - }, - new TextBlock - { - Text = o.Value, - } - }, - } - }), - }, Items = new[] { - new Item { Name = "Foo", Value = "Bar" }, - new Item { Name = "Buzz", Value = "Aldrin" }, - }, + "Foo", + "Bar", + } } } }