// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex.Controls { using System; using System.Linq; using Perspex.Controls; public class ControlTemplate { private Func build; public ControlTemplate(Func build) { Contract.Requires(build != null); this.build = build; } public Control Build(ITemplatedControl templatedParent) { Contract.Requires(templatedParent != null); Control root = this.build(templatedParent); this.SetTemplatedParent(root, templatedParent); return root; } public static ControlTemplate Create(Func build) where TControl : ITemplatedControl { Contract.Requires(build != null); return new ControlTemplate(c => build((TControl)c)); } private void SetTemplatedParent(Control control, ITemplatedControl templatedParent) { Contract.Requires(control != null); Contract.Requires(templatedParent != null); control.TemplatedParent = templatedParent; if (!(control is ContentPresenter)) { foreach (Control child in ((IVisual)control).VisualChildren.OfType()) { this.SetTemplatedParent(child, templatedParent); } } } } }