diff --git a/Perspex.Controls/Control.cs b/Perspex.Controls/Control.cs index 07dcafba62..c1b24cea1d 100644 --- a/Perspex.Controls/Control.cs +++ b/Perspex.Controls/Control.cs @@ -20,7 +20,7 @@ namespace Perspex.Controls using Perspex.Styling; using Splat; - public class Control : InputElement, ILogical, IStyleable, IStyleHost + public class Control : InputElement, INamed, ILogical, IStyleable, IStyleHost { public static readonly PerspexProperty DataContextProperty = PerspexProperty.Register("DataContext", inherits: true); diff --git a/Perspex.Controls/Deck.cs b/Perspex.Controls/Deck.cs index dd103953b6..8905d318a3 100644 --- a/Perspex.Controls/Deck.cs +++ b/Perspex.Controls/Deck.cs @@ -56,5 +56,10 @@ namespace Perspex.Controls { // Ignore pointer presses. } + + protected override void OnTemplateApplied() + { + base.OnTemplateApplied(); + } } } diff --git a/Perspex.Controls/INamed.cs b/Perspex.Controls/INamed.cs new file mode 100644 index 0000000000..5bbfe33fad --- /dev/null +++ b/Perspex.Controls/INamed.cs @@ -0,0 +1,13 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Controls +{ + public interface INamed + { + string Id { get; } + } +} diff --git a/Perspex.Controls/ItemsControl.cs b/Perspex.Controls/ItemsControl.cs index f379adaa7b..0c82b21cb7 100644 --- a/Perspex.Controls/ItemsControl.cs +++ b/Perspex.Controls/ItemsControl.cs @@ -83,7 +83,7 @@ namespace Perspex.Controls } } - protected ItemsPresenter Presenter + protected IItemsPresenter Presenter { get; private set; @@ -96,7 +96,7 @@ namespace Perspex.Controls protected override void OnTemplateApplied() { - this.Presenter = this.FindTemplateChild("itemsPresenter"); + this.Presenter = this.FindTemplateChild("itemsPresenter"); if (this.Presenter != null) { diff --git a/Perspex.Controls/Perspex.Controls.csproj b/Perspex.Controls/Perspex.Controls.csproj index 2df84b2b16..5d967ab63e 100644 --- a/Perspex.Controls/Perspex.Controls.csproj +++ b/Perspex.Controls/Perspex.Controls.csproj @@ -42,12 +42,14 @@ + + diff --git a/Perspex.Controls/Presenters/DeckPresenter.cs b/Perspex.Controls/Presenters/DeckPresenter.cs index ddb1421b01..d4e3c79a8c 100644 --- a/Perspex.Controls/Presenters/DeckPresenter.cs +++ b/Perspex.Controls/Presenters/DeckPresenter.cs @@ -17,7 +17,7 @@ namespace Perspex.Controls.Presenters using System.Linq; using System.Reactive.Linq; - public class DeckPresenter : Control, IVisual, IPresenter, ITemplatedControl + public class DeckPresenter : Control, IItemsPresenter, ITemplatedControl { public static readonly PerspexProperty ItemsProperty = ItemsControl.ItemsProperty.AddOwner(); diff --git a/Perspex.Controls/Presenters/IItemsPresenter.cs b/Perspex.Controls/Presenters/IItemsPresenter.cs new file mode 100644 index 0000000000..0a0053a0f4 --- /dev/null +++ b/Perspex.Controls/Presenters/IItemsPresenter.cs @@ -0,0 +1,13 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Controls.Presenters +{ + public interface IItemsPresenter : IPresenter + { + Panel Panel { get; } + } +} diff --git a/Perspex.Controls/Presenters/IPresenter.cs b/Perspex.Controls/Presenters/IPresenter.cs index fff6bdd7f0..43a0987858 100644 --- a/Perspex.Controls/Presenters/IPresenter.cs +++ b/Perspex.Controls/Presenters/IPresenter.cs @@ -18,7 +18,7 @@ namespace Perspex.Controls.Presenters /// of a then that signals that the visual child /// of the presenter is not a part of the template. /// - public interface IPresenter : IVisual + public interface IPresenter : IVisual, INamed { } } diff --git a/Perspex.Controls/Presenters/ItemsPresenter.cs b/Perspex.Controls/Presenters/ItemsPresenter.cs index 4ee2cd1486..1d349c419f 100644 --- a/Perspex.Controls/Presenters/ItemsPresenter.cs +++ b/Perspex.Controls/Presenters/ItemsPresenter.cs @@ -14,7 +14,7 @@ namespace Perspex.Controls.Presenters using System.Collections.Specialized; using System.Reactive.Linq; - public class ItemsPresenter : Control, IVisual, IPresenter, ITemplatedControl + public class ItemsPresenter : Control, IItemsPresenter, ITemplatedControl { public static readonly PerspexProperty ItemsProperty = ItemsControl.ItemsProperty.AddOwner(); diff --git a/Perspex.Controls/Templates/TemplateExtensions.cs b/Perspex.Controls/Templates/TemplateExtensions.cs index 881aa98054..aac0bc3f68 100644 --- a/Perspex.Controls/Templates/TemplateExtensions.cs +++ b/Perspex.Controls/Templates/TemplateExtensions.cs @@ -15,12 +15,12 @@ namespace Perspex.Controls.Templates public static class TemplateExtensions { - public static T FindTemplateChild(this ITemplatedControl control, string id) where T : Control + public static T FindTemplateChild(this ITemplatedControl control, string id) where T : INamed { return control.GetTemplateChildren().OfType().SingleOrDefault(x => x.Id == id); } - public static T GetTemplateChild(this ITemplatedControl control, string id) where T : Control + public static T GetTemplateChild(this ITemplatedControl control, string id) where T : INamed { var result = control.FindTemplateChild(id); diff --git a/Tests/Perspex.Base.UnitTests/PerspexObjectTests.cs b/Tests/Perspex.Base.UnitTests/PerspexObjectTests.cs index 39f70462a3..4577059964 100644 --- a/Tests/Perspex.Base.UnitTests/PerspexObjectTests.cs +++ b/Tests/Perspex.Base.UnitTests/PerspexObjectTests.cs @@ -35,7 +35,7 @@ namespace Perspex.Base.UnitTests { string[] names = PerspexObject.GetProperties(typeof(Class2)).Select(x => x.Name).ToArray(); - Assert.Equal(new[] { "Bar", "Foo", "Baz", "Qux" }, names); + Assert.Equal(new[] { "Bar", "Flob", "Foo", "Baz", "Qux" }, names); } [Fact] diff --git a/Tests/Perspex.Controls.UnitTests/DeckTests.cs b/Tests/Perspex.Controls.UnitTests/DeckTests.cs new file mode 100644 index 0000000000..25581050cf --- /dev/null +++ b/Tests/Perspex.Controls.UnitTests/DeckTests.cs @@ -0,0 +1,68 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2015 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Controls.UnitTests +{ + using Perspex.Controls.Presenters; + using Perspex.LogicalTree; + using System.Linq; + using Xunit; + + public class DeckTests + { + [Fact] + public void First_Item_Should_Be_Selected_By_Default() + { + var target = new Deck + { + Template = ControlTemplate.Create(this.CreateTemplate), + Items = new[] + { + "Foo", + "Bar" + } + }; + + target.ApplyTemplate(); + + Assert.Equal("Foo", target.SelectedItem); + } + + [Fact] + public void LogicalChild_Should_Be_Selected_Item() + { + var target = new Deck + { + Template = ControlTemplate.Create(this.CreateTemplate), + Items = new[] + { + "Foo", + "Bar" + } + }; + + target.ApplyTemplate(); + + Assert.Equal(1, target.GetLogicalChildren().Count()); + + var child = target.GetLogicalChildren().Single(); + Assert.IsType(child); + Assert.Equal("Foo", ((TextBlock)child).Text); + } + + private Control CreateTemplate(Deck control) + { + return new DeckPresenter + { + Id = "itemsPresenter", + [~ItemsPresenter.ItemsProperty] = control[~Deck.ItemsProperty], + [~ItemsPresenter.ItemsPanelProperty] = control[~Deck.ItemsPanelProperty], + [~DeckPresenter.SelectedItemProperty] = control[~Deck.SelectedItemProperty], + [~DeckPresenter.TransitionProperty] = control[~Deck.TransitionProperty], + }; + } + } +} diff --git a/Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj b/Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj index 2b5a06e73a..9f33679406 100644 --- a/Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj +++ b/Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj @@ -99,6 +99,7 @@ +