Browse Source

Refactored templates a bit.

Added interfaces, moved them to Controls.Templates namespace and added
base classes for common Func<> templates.
pull/69/head
Steven Kirk 11 years ago
parent
commit
c0fc38358f
  1. 1
      Perspex.Application/Application.cs
  2. 1
      Perspex.Controls/Control.cs
  3. 39
      Perspex.Controls/ControlTemplate.cs
  4. 80
      Perspex.Controls/DataTemplate.cs
  5. 2
      Perspex.Controls/Generators/ItemContainerGenerator.cs
  6. 1
      Perspex.Controls/IControl.cs
  7. 15
      Perspex.Controls/IDataTemplate.cs
  8. 1
      Perspex.Controls/IGlobalDataTemplates.cs
  9. 15
      Perspex.Controls/Perspex.Controls.csproj
  10. 2
      Perspex.Controls/Presenters/ContentPresenter.cs
  11. 27
      Perspex.Controls/Templates/ControlTemplate.cs
  12. 28
      Perspex.Controls/Templates/ControlTemplate`2.cs
  13. 84
      Perspex.Controls/Templates/DataTemplate.cs
  14. 4
      Perspex.Controls/Templates/DataTemplateExtensions.cs
  15. 63
      Perspex.Controls/Templates/DataTemplate`1.cs
  16. 9
      Perspex.Controls/Templates/DataTemplates.cs
  17. 41
      Perspex.Controls/Templates/FuncTemplate`1.cs
  18. 44
      Perspex.Controls/Templates/FuncTemplate`2.cs
  19. 18
      Perspex.Controls/Templates/IControlTemplate.cs
  20. 23
      Perspex.Controls/Templates/IDataTemplate.cs
  21. 23
      Perspex.Controls/Templates/ITemplate`1.cs
  22. 25
      Perspex.Controls/Templates/ITemplate`2.cs
  23. 31
      Perspex.Controls/TreeDataTemplate.cs
  24. 3
      Perspex.Diagnostics/ViewLocator.cs
  25. 7
      Perspex.Diagnostics/Views/LogicalTreeView.cs
  26. 1
      Perspex.Diagnostics/Views/VisualTreeView.cs
  27. 3
      Perspex.Themes.Default/ButtonStyle.cs
  28. 8
      Perspex.Themes.Default/CheckBoxStyle.cs
  29. 4
      Perspex.Themes.Default/ContentControlStyle.cs
  30. 5
      Perspex.Themes.Default/DeckStyle.cs
  31. 4
      Perspex.Themes.Default/DropDownStyle.cs
  32. 5
      Perspex.Themes.Default/GridSplitterStyle.cs
  33. 3
      Perspex.Themes.Default/ItemsControlStyle.cs
  34. 5
      Perspex.Themes.Default/ListBoxItemStyle.cs
  35. 5
      Perspex.Themes.Default/ListBoxStyle.cs
  36. 5
      Perspex.Themes.Default/MenuItemStyle.cs
  37. 3
      Perspex.Themes.Default/MenuStyle.cs
  38. 4
      Perspex.Themes.Default/PopupRootStyle.cs
  39. 3
      Perspex.Themes.Default/ProgressBarStyle.cs
  40. 8
      Perspex.Themes.Default/RadioButtonStyle.cs
  41. 9
      Perspex.Themes.Default/ScrollBarStyle.cs
  42. 4
      Perspex.Themes.Default/ScrollViewerStyle.cs
  43. 9
      Perspex.Themes.Default/TabControlStyle.cs
  44. 3
      Perspex.Themes.Default/TabItemStyle.cs
  45. 3
      Perspex.Themes.Default/TabStripStyle.cs
  46. 7
      Perspex.Themes.Default/TextBoxStyle.cs
  47. 3
      Perspex.Themes.Default/ToggleButtonStyle.cs
  48. 5
      Perspex.Themes.Default/ToolTipStyle.cs
  49. 11
      Perspex.Themes.Default/TreeViewItemStyle.cs
  50. 3
      Perspex.Themes.Default/TreeViewStyle.cs
  51. 4
      Perspex.Themes.Default/WindowStyle.cs
  52. 4
      TestApplication/Program.cs
  53. 2
      Tests/Perspex.Controls.UnitTests/ContentControlTests.cs
  54. 7
      Tests/Perspex.Controls.UnitTests/DeckTests.cs
  55. 2
      Tests/Perspex.Controls.UnitTests/DropDownTests.cs
  56. 2
      Tests/Perspex.Controls.UnitTests/ItemsControlTests.cs
  57. 1
      Tests/Perspex.Controls.UnitTests/ListBoxTests.cs
  58. 8
      Tests/Perspex.Controls.UnitTests/Primitives/ScrollBarTests.cs
  59. 3
      Tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
  60. 6
      Tests/Perspex.Controls.UnitTests/ScrollViewerTests.cs
  61. 16
      Tests/Perspex.Controls.UnitTests/TabControlTests.cs
  62. 9
      Tests/Perspex.Controls.UnitTests/TabStripTests.cs
  63. 9
      Tests/Perspex.Controls.UnitTests/TopLevelTests.cs
  64. 1
      Tests/Perspex.Styling.UnitTests/SelectorTests_Multiple.cs

1
Perspex.Application/Application.cs

@ -9,6 +9,7 @@ namespace Perspex
using System;
using System.Threading;
using Perspex.Controls;
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Layout;
using Perspex.Rendering;

1
Perspex.Controls/Control.cs

@ -11,6 +11,7 @@ namespace Perspex.Controls
using System.Reactive.Linq;
using Perspex.Collections;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Interactivity;
using Perspex.LogicalTree;

39
Perspex.Controls/ControlTemplate.cs

@ -1,39 +0,0 @@
// -----------------------------------------------------------------------
// <copyright file="ControlTemplate.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
using System;
using Perspex.Styling;
public class ControlTemplate
{
private Func<ITemplatedControl, Control> build;
public ControlTemplate(Func<ITemplatedControl, Control> build)
{
Contract.Requires<NullReferenceException>(build != null);
this.build = build;
}
public static ControlTemplate Create<TControl>(Func<TControl, Control> build)
where TControl : ITemplatedControl
{
Contract.Requires<NullReferenceException>(build != null);
return new ControlTemplate(c => build((TControl)c));
}
public Control Build(ITemplatedControl templatedParent)
{
Contract.Requires<NullReferenceException>(templatedParent != null);
var root = this.build(templatedParent);
return root;
}
}
}

80
Perspex.Controls/DataTemplate.cs

@ -1,80 +0,0 @@
// -----------------------------------------------------------------------
// <copyright file="DataTemplate.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
using System;
using System.Reflection;
public class DataTemplate : IDataTemplate
{
public static readonly DataTemplate Default =
new DataTemplate(typeof(object), o => (o != null) ? new TextBlock { Text = o.ToString() } : null);
public DataTemplate(Func<object, Control> build)
: this(o => true, build)
{
}
public DataTemplate(Type type, Func<object, Control> build)
: this(o => IsInstance(o, type), build)
{
}
public DataTemplate(Func<object, bool> match, Func<object, Control> build)
{
Contract.Requires<ArgumentNullException>(match != null);
Contract.Requires<ArgumentNullException>(build != null);
this.Match = match;
this.Build = build;
}
public Func<object, bool> Match { get; private set; }
public Func<object, Control> Build { get; private set; }
public static bool IsInstance(object o, Type t)
{
return (o != null) ?
t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo()) :
false;
}
bool IDataTemplate.Match(object data)
{
return this.Match(data);
}
Control IDataTemplate.Build(object data)
{
return this.Build(data);
}
}
public class DataTemplate<T> : DataTemplate
{
public DataTemplate(Func<T, Control> build)
: base(typeof(T), DataTemplate<T>.Cast(build))
{
}
public DataTemplate(Func<T, bool> match, Func<T, Control> build)
: base(CastMatch(match), DataTemplate<T>.Cast(build))
{
}
private static Func<object, bool> CastMatch(Func<T, bool> f)
{
return o => (o is T) ? f((T)o) : false;
}
private static Func<object, TResult> Cast<TResult>(Func<T, TResult> f)
{
return o => f((T)o);
}
}
}

2
Perspex.Controls/Generators/ItemContainerGenerator.cs

@ -126,7 +126,7 @@ namespace Perspex.Controls.Generators
protected virtual Control CreateContainerOverride(object item)
{
return this.Owner.MaterializeDataTemplate(item);
return (Control)this.Owner.MaterializeDataTemplate(item);
}
protected void AddInternal(object item, Control container)

1
Perspex.Controls/IControl.cs

@ -6,6 +6,7 @@
namespace Perspex.Controls
{
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Layout;
using Perspex.Styling;

15
Perspex.Controls/IDataTemplate.cs

@ -1,15 +0,0 @@
// -----------------------------------------------------------------------
// <copyright file="IDataTemplate.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
public interface IDataTemplate
{
bool Match(object data);
Control Build(object data);
}
}

1
Perspex.Controls/IGlobalDataTemplates.cs

@ -7,6 +7,7 @@
namespace Perspex.Controls
{
using System.Collections.Generic;
using Perspex.Controls.Templates;
public interface IGlobalDataTemplates
{

15
Perspex.Controls/Perspex.Controls.csproj

@ -58,7 +58,12 @@
<Compile Include="Platform\ITopLevelImpl.cs" />
<Compile Include="PlacementMode.cs" />
<Compile Include="Popup.cs" />
<Compile Include="IDataTemplate.cs" />
<Compile Include="Templates\ControlTemplate`2.cs" />
<Compile Include="Templates\DataTemplate`1.cs" />
<Compile Include="Templates\IControlTemplate.cs" />
<Compile Include="Templates\FuncTemplate`2.cs" />
<Compile Include="Templates\FuncTemplate`1.cs" />
<Compile Include="Templates\IDataTemplate.cs" />
<Compile Include="Presenters\IItemsPresenter.cs" />
<Compile Include="Presenters\IPresenter.cs" />
<Compile Include="Presenters\DeckPresenter.cs" />
@ -81,14 +86,14 @@
<Compile Include="Control.cs" />
<Compile Include="ControlExtensions.cs" />
<Compile Include="Controls.cs" />
<Compile Include="ControlTemplate.cs" />
<Compile Include="Templates\ControlTemplate.cs" />
<Compile Include="Templates\DataTemplateExtensions.cs" />
<Compile Include="DataTemplate.cs" />
<Compile Include="Templates\DataTemplate.cs" />
<Compile Include="Generators\TreeItemContainerGenerator.cs" />
<Compile Include="Generators\TypedItemContainerGenerator.cs" />
<Compile Include="Generators\ItemContainerGenerator.cs" />
<Compile Include="IGlobalDataTemplates.cs" />
<Compile Include="DataTemplates.cs" />
<Compile Include="Templates\DataTemplates.cs" />
<Compile Include="Decorator.cs" />
<Compile Include="DefinitionBase.cs" />
<Compile Include="Grid.cs" />
@ -107,6 +112,8 @@
<Compile Include="Primitives\Thumb.cs" />
<Compile Include="RequestBringIntoViewEventArgs.cs" />
<Compile Include="Shapes\Ellipse.cs" />
<Compile Include="Templates\ITemplate`2.cs" />
<Compile Include="Templates\ITemplate`1.cs" />
<Compile Include="ToolTip.cs" />
<Compile Include="UserControl.cs" />
<Compile Include="Templates\TemplateExtensions.cs" />

2
Perspex.Controls/Presenters/ContentPresenter.cs

@ -86,7 +86,7 @@ namespace Perspex.Controls.Presenters
if (content != null)
{
result = this.MaterializeDataTemplate(content);
result = (Control)this.MaterializeDataTemplate(content);
if (result.Parent == null)
{

27
Perspex.Controls/Templates/ControlTemplate.cs

@ -0,0 +1,27 @@
// -----------------------------------------------------------------------
// <copyright file="ControlTemplate.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
using System;
using Perspex.Controls.Primitives;
using Perspex.Styling;
/// <summary>
/// A template for a <see cref="TemplatedControl"/>.
/// </summary>
public class ControlTemplate : FuncTemplate<ITemplatedControl, Control>, IControlTemplate
{
/// <summary>
/// Initializes a new instance of the <see cref="ControlTemplate"/> class.
/// </summary>
/// <param name="build">The build function.</param>
public ControlTemplate(Func<ITemplatedControl, Control> build)
: base(build)
{
}
}
}

28
Perspex.Controls/Templates/ControlTemplate`2.cs

@ -0,0 +1,28 @@
// -----------------------------------------------------------------------
// <copyright file="ControlTemplate`2.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
using System;
using Perspex.Controls.Primitives;
using Styling;
/// <summary>
/// A template for a <see cref="TemplatedControl"/>.
/// </summary>
/// <typeparam name="T">The type of the lookless control.</typeparam>
public class ControlTemplate<T> : ControlTemplate where T : ITemplatedControl
{
/// <summary>
/// Initializes a new instance of the <see cref="ControlTemplate{T}"/> class.
/// </summary>
/// <param name="build">The build function.</param>
public ControlTemplate(Func<T, Control> build)
: base(x => build((T)x))
{
}
}
}

84
Perspex.Controls/Templates/DataTemplate.cs

@ -0,0 +1,84 @@
// -----------------------------------------------------------------------
// <copyright file="DataTemplate.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
using System;
using System.Reflection;
/// <summary>
/// Builds a control for a piece of data.
/// </summary>
public class DataTemplate : FuncTemplate<object, IControl>, IDataTemplate
{
/// <summary>
/// The default data template used in the case where not matching data template is found.
/// </summary>
public static readonly DataTemplate Default =
new DataTemplate(typeof(object), o => (o != null) ? new TextBlock { Text = o.ToString() } : null);
/// <summary>
/// The implementation of the <see cref="Match"/> method.
/// </summary>
private Func<object, bool> match;
/// <summary>
/// Initializes a new instance of the <see cref="DataTemplate"/> class.
/// </summary>
/// <param name="type">The type of data which the data template matches.</param>
/// <param name="build">
/// A function which when passed an object of <paramref name="type"/> returns a control.
/// </param>
public DataTemplate(Type type, Func<object, IControl> build)
: this(o => IsInstance(o, type), build)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="DataTemplate"/> class.
/// </summary>
/// <param name="match">
/// A function which determines whether the data template matches the specified data.
/// </param>
/// <param name="build">
/// A function which returns a control for matching data.
/// </param>
public DataTemplate(Func<object, bool> match, Func<object, IControl> build)
: base(build)
{
Contract.Requires<ArgumentNullException>(match != null);
this.match = match;
}
/// <summary>
/// Checks to see if this data template matches the specified data.
/// </summary>
/// <param name="data">The data.</param>
/// <returns>
/// True if the data template can build a control for the data, otherwise false.
/// </returns>
public bool Match(object data)
{
return this.match(data);
}
/// <summary>
/// Determines of an object is of the specified type.
/// </summary>
/// <param name="o">The object.</param>
/// <param name="t">The type.</param>
/// <returns>
/// True if <paramref name="o"/> is of type <paramref name="t"/>, otherwise false.
/// </returns>
private static bool IsInstance(object o, Type t)
{
return (o != null) ?
t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo()) :
false;
}
}
}

4
Perspex.Controls/Templates/DataTemplateExtensions.cs

@ -12,10 +12,10 @@ namespace Perspex.Controls.Templates
public static class DataTemplateExtensions
{
public static Control MaterializeDataTemplate(this Control control, object data)
public static IControl MaterializeDataTemplate(this Control control, object data)
{
IDataTemplate template = control.FindDataTemplate(data);
Control result;
IControl result;
if (template != null)
{

63
Perspex.Controls/Templates/DataTemplate`1.cs

@ -0,0 +1,63 @@
// -----------------------------------------------------------------------
// <copyright file="DataTemplate`1.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
using System;
/// <summary>
/// Builds a control for a piece of data of specified type.
/// </summary>
/// <typeparam name="T">The type of the template's data.</typeparam>
public class DataTemplate<T> : DataTemplate
{
/// <summary>
/// Initializes a new instance of the <see cref="DataTemplate{T}"/> class.
/// </summary>
/// <param name="build">
/// A function which when passed an object of <typeparamref name="T"/> returns a control.
/// </param>
public DataTemplate(Func<T, Control> build)
: base(typeof(T), CastBuild(build))
{
}
/// <summary>
/// Initializes a new instance of the <see cref="DataTemplate{T}"/> class.
/// </summary>
/// <param name="match">
/// A function which determines whether the data template matches the specified data.
/// </param>
/// <param name="build">
/// A function which when passed an object of <typeparamref name="T"/> returns a control.
/// </param>
public DataTemplate(Func<T, bool> match, Func<T, Control> build)
: base(CastMatch(match), CastBuild(build))
{
}
/// <summary>
/// Casts a stongly typed match function to a weakly typed one.
/// </summary>
/// <param name="f">The strongly typed function.</param>
/// <returns>The weakly typed function.</returns>
private static Func<object, bool> CastMatch(Func<T, bool> f)
{
return o => (o is T) ? f((T)o) : false;
}
/// <summary>
/// Casts a stongly typed build function to a weakly typed one.
/// </summary>
/// <typeparam name="TResult">The strong data type.</typeparam>
/// <param name="f">The strongly typed function.</param>
/// <returns>The weakly typed function.</returns>
private static Func<object, TResult> CastBuild<TResult>(Func<T, TResult> f)
{
return o => f((T)o);
}
}
}

9
Perspex.Controls/DataTemplates.cs → Perspex.Controls/Templates/DataTemplates.cs

@ -1,14 +1,17 @@
// -----------------------------------------------------------------------
// <copyright file="DataTemplates.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
namespace Perspex.Controls.Templates
{
using Perspex.Collections;
/// <summary>
/// A collection of <see cref="IDataTemplate"/>s.
/// </summary>
public class DataTemplates : PerspexList<IDataTemplate>
{
}
}
}

41
Perspex.Controls/Templates/FuncTemplate`1.cs

@ -0,0 +1,41 @@
// -----------------------------------------------------------------------
// <copyright file="FuncTemplate`1.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
using System;
/// <summary>
/// Creates a control from a <see cref="Func{TControl}"/>.
/// </summary>
/// <typeparam name="TControl">The type of control.</typeparam>
public class FuncTemplate<TControl> : ITemplate<TControl> where TControl : IControl
{
private Func<TControl> func;
/// <summary>
/// Initializes a new instance of the <see cref="FuncTemplate{TControl}"/> class.
/// </summary>
/// <param name="func">The function used to create the control.</param>
public FuncTemplate(Func<TControl> func)
{
Contract.Requires<ArgumentNullException>(func != null);
this.func = func;
}
/// <summary>
/// Creates the control.
/// </summary>
/// <returns>
/// The created control.
/// </returns>
public TControl Build()
{
return this.func();
}
}
}

44
Perspex.Controls/Templates/FuncTemplate`2.cs

@ -0,0 +1,44 @@
// -----------------------------------------------------------------------
// <copyright file="FuncTemplate`2.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
using System;
/// <summary>
/// Creates a control from a <see cref="Func{TParam, TControl}"/>.
/// </summary>
/// <typeparam name="TParam">The type of the parameter.</typeparam>
/// <typeparam name="TControl">The type of control.</typeparam>
public class FuncTemplate<TParam, TControl> : ITemplate<TParam, TControl>
where TControl : IControl
{
private Func<TParam, TControl> func;
/// <summary>
/// Initializes a new instance of the <see cref="FuncTemplate{TControl, TParam}"/> class.
/// </summary>
/// <param name="func">The function used to create the control.</param>
public FuncTemplate(Func<TParam, TControl> func)
{
Contract.Requires<ArgumentNullException>(func != null);
this.func = func;
}
/// <summary>
/// Creates the control.
/// </summary>
/// <param name="param">The parameter.</param>
/// <returns>
/// The created control.
/// </returns>
public TControl Build(TParam param)
{
return this.func(param);
}
}
}

18
Perspex.Controls/Templates/IControlTemplate.cs

@ -0,0 +1,18 @@
// -----------------------------------------------------------------------
// <copyright file="IControlTemplate.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
using Perspex.Controls.Primitives;
using Perspex.Styling;
/// <summary>
/// Interface representing a template used to build a <see cref="TemplatedControl"/>.
/// </summary>
public interface IControlTemplate : ITemplate<ITemplatedControl, Control>
{
}
}

23
Perspex.Controls/Templates/IDataTemplate.cs

@ -0,0 +1,23 @@
// -----------------------------------------------------------------------
// <copyright file="IDataTemplate.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
/// <summary>
/// Interface representing a template used to build a control for a piece of data.
/// </summary>
public interface IDataTemplate : ITemplate<object, IControl>
{
/// <summary>
/// Checks to see if this data template matches the specified data.
/// </summary>
/// <param name="data">The data.</param>
/// <returns>
/// True if the data template can build a control for the data, otherwise false.
/// </returns>
bool Match(object data);
}
}

23
Perspex.Controls/Templates/ITemplate`1.cs

@ -0,0 +1,23 @@
// -----------------------------------------------------------------------
// <copyright file="ITemplate`1.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
/// <summary>
/// Creates a control.
/// </summary>
/// <typeparam name="TControl">The type of control.</typeparam>
public interface ITemplate<TControl> where TControl : IControl
{
/// <summary>
/// Creates the control.
/// </summary>
/// <returns>
/// The created control.
/// </returns>
TControl Build();
}
}

25
Perspex.Controls/Templates/ITemplate`2.cs

@ -0,0 +1,25 @@
// -----------------------------------------------------------------------
// <copyright file="ITemplate`2.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
/// <summary>
/// Creates a control based on a parameter.
/// </summary>
/// <typeparam name="TParam">The type of the parameter.</typeparam>
/// <typeparam name="TControl">The type of control.</typeparam>
public interface ITemplate<TParam, TControl> where TControl : IControl
{
/// <summary>
/// Creates the control.
/// </summary>
/// <param name="param">The parameter.</param>
/// <returns>
/// The created control.
/// </returns>
TControl Build(TParam param);
}
}

31
Perspex.Controls/TreeDataTemplate.cs

@ -8,11 +8,13 @@ namespace Perspex.Controls
{
using System;
using System.Collections;
using System.Reflection;
using Perspex.Controls.Templates;
public class TreeDataTemplate : DataTemplate
{
public TreeDataTemplate(
Func<object, Control> build,
Func<object, IControl> build,
Func<object, IEnumerable> itemsSelector)
: this(o => true, build, itemsSelector)
{
@ -20,24 +22,24 @@ namespace Perspex.Controls
public TreeDataTemplate(
Type type,
Func<object, Control> build,
Func<object, IControl> build,
Func<object, IEnumerable> itemsSelector)
: this(o => DataTemplate.IsInstance(o, type), build, itemsSelector)
: this(o => IsInstance(o, type), build, itemsSelector)
{
}
public TreeDataTemplate(
Type type,
Func<object, Control> build,
Func<object, IControl> build,
Func<object, IEnumerable> itemsSelector,
Func<object, bool> isExpanded)
: this(o => DataTemplate.IsInstance(o, type), build, itemsSelector, isExpanded)
: this(o => IsInstance(o, type), build, itemsSelector, isExpanded)
{
}
public TreeDataTemplate(
Func<object, bool> match,
Func<object, Control> build,
Func<object, IControl> build,
Func<object, IEnumerable> itemsSelector)
: this(match, build, itemsSelector, _ => false)
{
@ -46,7 +48,7 @@ namespace Perspex.Controls
public TreeDataTemplate(
Func<object, bool> match,
Func<object, Control> build,
Func<object, IControl> build,
Func<object, IEnumerable> itemsSelector,
Func<object, bool> isExpanded)
: base(match, build)
@ -58,6 +60,21 @@ namespace Perspex.Controls
public Func<object, IEnumerable> ItemsSelector { get; private set; }
public Func<object, bool> IsExpanded { get; private set; }
/// <summary>
/// Determines of an object is of the specified type.
/// </summary>
/// <param name="o">The object.</param>
/// <param name="t">The type.</param>
/// <returns>
/// True if <paramref name="o"/> is of type <paramref name="t"/>, otherwise false.
/// </returns>
private static bool IsInstance(object o, Type t)
{
return (o != null) ?
t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo()) :
false;
}
}
public class TreeDataTemplate<T> : TreeDataTemplate

3
Perspex.Diagnostics/ViewLocator.cs

@ -8,10 +8,11 @@ namespace Perspex.Diagnostics
{
using System;
using Perspex.Controls;
using Perspex.Controls.Templates;
internal class ViewLocator<TViewModel> : IDataTemplate
{
public Control Build(object data)
public IControl Build(object data)
{
var name = data.GetType().FullName.Replace("ViewModel", "View");
var type = Type.GetType(name);

7
Perspex.Diagnostics/Views/LogicalTreeView.cs

@ -1,16 +1,17 @@
// -----------------------------------------------------------------------
// <copyright file="DevTools.cs" company="Steven Kirk">
// <copyright file="LogicalTreeView.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Diagnostics.Views
{
using System;
using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.Controls.Templates;
using Perspex.Diagnostics.ViewModels;
using ReactiveUI;
using System;
using System.Reactive.Linq;
internal class LogicalTreeView : TreePage
{

1
Perspex.Diagnostics/Views/VisualTreeView.cs

@ -9,6 +9,7 @@ namespace Perspex.Diagnostics.Views
using System;
using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.Controls.Templates;
using Perspex.Diagnostics.ViewModels;
using Perspex.Media;
using ReactiveUI;

3
Perspex.Themes.Default/ButtonStyle.cs

@ -11,6 +11,7 @@ namespace Perspex.Themes.Default
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Shapes;
using Perspex.Controls.Templates;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Styling;
@ -26,7 +27,7 @@ namespace Perspex.Themes.Default
Setters = new[]
{
new Setter(Button.FocusAdornerProperty, new AdornerTemplate(FocusAdornerTemplate)),
new Setter(Button.TemplateProperty, ControlTemplate.Create<Button>(this.Template)),
new Setter(Button.TemplateProperty, new ControlTemplate<Button>(this.Template)),
new Setter(Button.HorizontalContentAlignmentProperty, HorizontalAlignment.Center),
new Setter(Button.VerticalContentAlignmentProperty, VerticalAlignment.Center),
},

8
Perspex.Themes.Default/CheckBoxStyle.cs

@ -6,14 +6,14 @@
namespace Perspex.Themes.Default
{
using System;
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Shapes;
using Perspex.Controls.Templates;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Controls.Shapes;
using Perspex.Styling;
using Perspex.Controls.Presenters;
public class CheckBoxStyle : Styles
{
@ -25,7 +25,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(Button.TemplateProperty, ControlTemplate.Create<CheckBox>(this.Template)),
new Setter(Button.TemplateProperty, new ControlTemplate<CheckBox>(this.Template)),
},
},
new Style(x => x.OfType<CheckBox>().Template().Name("checkMark"))

4
Perspex.Themes.Default/ContentControlStyle.cs

@ -9,7 +9,7 @@ namespace Perspex.Themes.Default
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Media;
using Perspex.Controls.Templates;
using Perspex.Styling;
public class ContentControlStyle : Styles
@ -22,7 +22,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ContentControl.TemplateProperty, ControlTemplate.Create<ContentControl>(this.Template)),
new Setter(ContentControl.TemplateProperty, new ControlTemplate<ContentControl>(this.Template)),
},
},
});

5
Perspex.Themes.Default/DeckStyle.cs

@ -6,10 +6,11 @@
namespace Perspex.Themes.Default
{
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Styling;
using System.Linq;
public class DeckStyle : Styles
{
@ -21,7 +22,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(Deck.TemplateProperty, ControlTemplate.Create<Deck>(this.Template)),
new Setter(Deck.TemplateProperty, new ControlTemplate<Deck>(this.Template)),
},
},
});

4
Perspex.Themes.Default/DropDownStyle.cs

@ -9,9 +9,9 @@ namespace Perspex.Themes.Default
using System.Linq;
using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Shapes;
using Perspex.Controls.Templates;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Styling;
@ -26,7 +26,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(DropDown.TemplateProperty, ControlTemplate.Create<DropDown>(this.Template)),
new Setter(DropDown.TemplateProperty, new ControlTemplate<DropDown>(this.Template)),
new Setter(DropDown.BorderBrushProperty, new SolidColorBrush(0xff707070)),
new Setter(DropDown.BorderThicknessProperty, 2.0),
new Setter(DropDown.HorizontalContentAlignmentProperty, HorizontalAlignment.Center),

5
Perspex.Themes.Default/GridSplitterStyle.cs

@ -6,9 +6,10 @@
namespace Perspex.Themes.Default
{
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Templates;
using Perspex.Styling;
using System.Linq;
public class GridSplitterStyle : Styles
{
@ -20,7 +21,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(GridSplitter.TemplateProperty, ControlTemplate.Create<GridSplitter>(this.Template)),
new Setter(GridSplitter.TemplateProperty, new ControlTemplate<GridSplitter>(this.Template)),
new Setter(GridSplitter.WidthProperty, 4.0),
},
},

3
Perspex.Themes.Default/ItemsControlStyle.cs

@ -9,6 +9,7 @@ namespace Perspex.Themes.Default
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Styling;
public class ItemsControlStyle : Styles
@ -21,7 +22,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(Button.TemplateProperty, ControlTemplate.Create<ItemsControl>(this.Template)),
new Setter(Button.TemplateProperty, new ControlTemplate<ItemsControl>(this.Template)),
},
},
});

5
Perspex.Themes.Default/ListBoxItemStyle.cs

@ -6,11 +6,12 @@
namespace Perspex.Themes.Default
{
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Media;
using Perspex.Styling;
using System.Linq;
public class ListBoxItemStyle : Styles
{
@ -22,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ListBoxItem.TemplateProperty, ControlTemplate.Create<ListBoxItem>(this.Template)),
new Setter(ListBoxItem.TemplateProperty, new ControlTemplate<ListBoxItem>(this.Template)),
},
},
new Style(x => x.OfType<ListBoxItem>().Class("selected").Template().Name("border"))

5
Perspex.Themes.Default/ListBoxStyle.cs

@ -6,11 +6,12 @@
namespace Perspex.Themes.Default
{
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Media;
using Perspex.Styling;
using System.Linq;
public class ListBoxStyle : Styles
{
@ -22,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ListBox.TemplateProperty, ControlTemplate.Create<ListBox>(this.Template)),
new Setter(ListBox.TemplateProperty, new ControlTemplate<ListBox>(this.Template)),
new Setter(ListBox.BorderBrushProperty, Brushes.Black),
new Setter(ListBox.BorderThicknessProperty, 1.0),
},

5
Perspex.Themes.Default/MenuItemStyle.cs

@ -11,6 +11,7 @@ namespace Perspex.Themes.Default
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Shapes;
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Layout;
using Perspex.Media;
@ -31,14 +32,14 @@ namespace Perspex.Themes.Default
{
new Setter(MenuItem.BorderThicknessProperty, 1.0),
new Setter(MenuItem.PaddingProperty, new Thickness(6, 0)),
new Setter(MenuItem.TemplateProperty, ControlTemplate.Create<MenuItem>(this.PopupTemplate)),
new Setter(MenuItem.TemplateProperty, new ControlTemplate<MenuItem>(this.PopupTemplate)),
},
},
new Style(x => x.OfType<Menu>().Child().OfType<MenuItem>())
{
Setters = new[]
{
new Setter(MenuItem.TemplateProperty, ControlTemplate.Create<MenuItem>(this.TopLevelTemplate)),
new Setter(MenuItem.TemplateProperty, new ControlTemplate<MenuItem>(this.TopLevelTemplate)),
},
},
new Style(x => x.OfType<MenuItem>().Class("selected").Template().Name("root"))

3
Perspex.Themes.Default/MenuStyle.cs

@ -9,6 +9,7 @@ namespace Perspex.Themes.Default
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Styling;
@ -22,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(Menu.TemplateProperty, ControlTemplate.Create<Menu>(this.Template)),
new Setter(Menu.TemplateProperty, new ControlTemplate<Menu>(this.Template)),
},
},
});

4
Perspex.Themes.Default/PopupRootStyle.cs

@ -9,7 +9,7 @@ namespace Perspex.Themes.Default
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Media;
using Perspex.Controls.Templates;
using Perspex.Styling;
public class PopupRootStyle : Styles
@ -22,7 +22,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(PopupRoot.TemplateProperty, ControlTemplate.Create<PopupRoot>(this.Template)),
new Setter(PopupRoot.TemplateProperty, new ControlTemplate<PopupRoot>(this.Template)),
new Setter(PopupRoot.FontFamilyProperty, "Segoe UI"),
new Setter(PopupRoot.FontSizeProperty, 12.0),
},

3
Perspex.Themes.Default/ProgressBarStyle.cs

@ -12,6 +12,7 @@ namespace Perspex.Themes.Default
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Shapes;
using Perspex.Controls.Templates;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Styling;
@ -26,7 +27,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ProgressBar.TemplateProperty, ControlTemplate.Create<ProgressBar>(this.Template)),
new Setter(ProgressBar.TemplateProperty, new ControlTemplate<ProgressBar>(this.Template)),
new Setter(ProgressBar.BackgroundProperty, new SolidColorBrush(0xffdddddd)),
new Setter(ProgressBar.ForegroundProperty, new SolidColorBrush(0xffbee6fd)),
},

8
Perspex.Themes.Default/RadioButtonStyle.cs

@ -6,14 +6,14 @@
namespace Perspex.Themes.Default
{
using System;
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Shapes;
using Perspex.Controls.Templates;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Controls.Shapes;
using Perspex.Styling;
using Perspex.Controls.Presenters;
public class RadioButtonStyle : Styles
{
@ -25,7 +25,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(Button.TemplateProperty, ControlTemplate.Create<RadioButton>(this.Template)),
new Setter(Button.TemplateProperty, new ControlTemplate<RadioButton>(this.Template)),
},
},
new Style(x => x.OfType<RadioButton>().Template().Name("checkMark"))

9
Perspex.Themes.Default/ScrollBarStyle.cs

@ -10,6 +10,7 @@ namespace Perspex.Themes.Default
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Media;
using Perspex.Styling;
@ -23,14 +24,14 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ScrollBar.TemplateProperty, ControlTemplate.Create<ScrollBar>(this.Template)),
new Setter(ScrollBar.TemplateProperty, new ControlTemplate<ScrollBar>(this.Template)),
},
},
new Style(x => x.OfType<ScrollBar>().PropertyEquals(ScrollBar.OrientationProperty, Orientation.Horizontal))
{
Setters = new[]
{
new Setter(ScrollBar.TemplateProperty, ControlTemplate.Create<ScrollBar>(this.Template)),
new Setter(ScrollBar.TemplateProperty, new ControlTemplate<ScrollBar>(this.Template)),
new Setter(ScrollBar.HeightProperty, 10.0),
},
},
@ -45,7 +46,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ScrollBar.TemplateProperty, ControlTemplate.Create<ScrollBar>(this.Template)),
new Setter(ScrollBar.TemplateProperty, new ControlTemplate<ScrollBar>(this.Template)),
new Setter(ScrollBar.WidthProperty, 10.0),
},
},
@ -75,7 +76,7 @@ namespace Perspex.Themes.Default
Thumb = new Thumb
{
Name = "thumb",
Template = ControlTemplate.Create<Thumb>(this.ThumbTemplate),
Template = new ControlTemplate<Thumb>(this.ThumbTemplate),
},
},
};

4
Perspex.Themes.Default/ScrollViewerStyle.cs

@ -10,7 +10,7 @@ namespace Perspex.Themes.Default
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Media;
using Perspex.Controls.Templates;
using Perspex.Styling;
public class ScrollViewerStyle : Styles
@ -23,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ScrollViewer.TemplateProperty, ControlTemplate.Create<ScrollViewer>(this.Template)),
new Setter(ScrollViewer.TemplateProperty, new ControlTemplate<ScrollViewer>(this.Template)),
},
},
});

9
Perspex.Themes.Default/TabControlStyle.cs

@ -9,12 +9,9 @@ namespace Perspex.Themes.Default
using System.Linq;
using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Styling;
using Perspex.Controls.Templates;
using Perspex.Animation;
using System;
using Perspex.Styling;
public class TabControlStyle : Styles
{
@ -26,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(TabControl.TemplateProperty, ControlTemplate.Create<TabControl>(this.Template)),
new Setter(TabControl.TemplateProperty, new ControlTemplate<TabControl>(this.Template)),
},
},
});
@ -54,7 +51,7 @@ namespace Perspex.Themes.Default
Name = "deck",
DataTemplates = new DataTemplates
{
new DataTemplate<TabItem>(x => control.MaterializeDataTemplate(x.Content)),
new DataTemplate<TabItem>(x => (Control)control.MaterializeDataTemplate(x.Content)),
},
[~Deck.ItemsProperty] = control[~TabControl.ItemsProperty],
[!Deck.SelectedItemProperty] = control[!TabControl.SelectedItemProperty],

3
Perspex.Themes.Default/TabItemStyle.cs

@ -9,6 +9,7 @@ namespace Perspex.Themes.Default
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Media;
using Perspex.Styling;
@ -24,7 +25,7 @@ namespace Perspex.Themes.Default
{
new Setter(TabItem.FontSizeProperty, 28.7),
new Setter(TabItem.ForegroundProperty, Brushes.Gray),
new Setter(TabItem.TemplateProperty, ControlTemplate.Create<TabItem>(this.Template)),
new Setter(TabItem.TemplateProperty, new ControlTemplate<TabItem>(this.Template)),
},
},
new Style(x => x.OfType<TabItem>().Class("selected"))

3
Perspex.Themes.Default/TabStripStyle.cs

@ -10,6 +10,7 @@ namespace Perspex.Themes.Default
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Styling;
public class TabStripStyle : Styles
@ -22,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(TabStrip.TemplateProperty, ControlTemplate.Create<TabStrip>(this.Template)),
new Setter(TabStrip.TemplateProperty, new ControlTemplate<TabStrip>(this.Template)),
},
},
new Style(x => x.OfType<TabStrip>().Template().OfType<ItemsPresenter>().Template().OfType<StackPanel>())

7
Perspex.Themes.Default/TextBoxStyle.cs

@ -6,13 +6,12 @@
namespace Perspex.Themes.Default
{
using System;
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Media;
using Perspex.Controls.Shapes;
using Perspex.Styling;
using Perspex.Controls.Presenters;
public class TextBoxStyle : Styles
{
@ -24,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(TextBox.TemplateProperty, ControlTemplate.Create<TextBox>(this.Template)),
new Setter(TextBox.TemplateProperty, new ControlTemplate<TextBox>(this.Template)),
new Setter(TextBox.BorderBrushProperty, new SolidColorBrush(0xff707070)),
new Setter(TextBox.BorderThicknessProperty, 2.0),
new Setter(TextBox.FocusAdornerProperty, null),

3
Perspex.Themes.Default/ToggleButtonStyle.cs

@ -10,6 +10,7 @@ namespace Perspex.Themes.Default
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Styling;
@ -24,7 +25,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ToggleButton.TemplateProperty, ControlTemplate.Create<ToggleButton>(this.Template)),
new Setter(ToggleButton.TemplateProperty, new ControlTemplate<ToggleButton>(this.Template)),
new Setter(ToggleButton.BackgroundProperty, new SolidColorBrush(0xffdddddd)),
new Setter(ToggleButton.BorderBrushProperty, new SolidColorBrush(0xff707070)),
new Setter(ToggleButton.BorderThicknessProperty, 2.0),

5
Perspex.Themes.Default/ToolTipStyle.cs

@ -6,11 +6,12 @@
namespace Perspex.Themes.Default
{
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Media;
using Perspex.Styling;
using System.Linq;
public class ToolTipStyle : Styles
{
@ -22,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ToolTip.TemplateProperty, ControlTemplate.Create<ToolTip>(this.Template)),
new Setter(ToolTip.TemplateProperty, new ControlTemplate<ToolTip>(this.Template)),
new Setter(ToolTip.BackgroundProperty, new SolidColorBrush(0xffffffe1)),
new Setter(ToolTip.BorderBrushProperty, Brushes.Gray),
new Setter(ToolTip.BorderThicknessProperty, 1.0),

11
Perspex.Themes.Default/TreeViewItemStyle.cs

@ -8,12 +8,13 @@ namespace Perspex.Themes.Default
{
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Shapes;
using Perspex.Controls.Templates;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Controls.Shapes;
using Perspex.Styling;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
public class TreeViewItemStyle : Styles
{
@ -25,7 +26,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(Button.TemplateProperty, ControlTemplate.Create<TreeViewItem>(this.Template)),
new Setter(Button.TemplateProperty, new ControlTemplate<TreeViewItem>(this.Template)),
},
},
new Style(x => x.OfType<TreeViewItem>().Template().Name("header"))
@ -47,7 +48,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(ToggleButton.TemplateProperty, ControlTemplate.Create<ToggleButton>(this.ToggleButtonTemplate)),
new Setter(ToggleButton.TemplateProperty, new ControlTemplate<ToggleButton>(this.ToggleButtonTemplate)),
},
},
new Style(x => x.OfType<TreeViewItem>().Template().OfType<ToggleButton>().Class("expander").Class(":checked").Template().OfType<Path>())

3
Perspex.Themes.Default/TreeViewStyle.cs

@ -9,6 +9,7 @@ namespace Perspex.Themes.Default
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Media;
using Perspex.Styling;
@ -22,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(TreeView.TemplateProperty, ControlTemplate.Create<TreeView>(this.Template)),
new Setter(TreeView.TemplateProperty, new ControlTemplate<TreeView>(this.Template)),
new Setter(TreeView.BorderBrushProperty, Brushes.Black),
new Setter(TreeView.BorderThicknessProperty, 1.0),
},

4
Perspex.Themes.Default/WindowStyle.cs

@ -10,7 +10,7 @@ namespace Perspex.Themes.Default
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Media;
using Perspex.Controls.Templates;
using Perspex.Styling;
public class WindowStyle : Styles
@ -23,7 +23,7 @@ namespace Perspex.Themes.Default
{
Setters = new[]
{
new Setter(Window.TemplateProperty, ControlTemplate.Create<Window>(this.Template)),
new Setter(Window.TemplateProperty, new ControlTemplate<Window>(this.Template)),
new Setter(Window.FontFamilyProperty, "Segoe UI"),
new Setter(Window.FontSizeProperty, 12.0),
},

4
TestApplication/Program.cs

@ -6,17 +6,15 @@ using Perspex.Collections;
using Perspex.Controls;
using Perspex.Controls.Primitives;
using Perspex.Controls.Shapes;
using Perspex.Controls.Templates;
using Perspex.Diagnostics;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Media.Imaging;
using Perspex.Rendering;
using Perspex.Threading;
#if PERSPEX_GTK
using Perspex.Gtk;
#endif
using ReactiveUI;
using Splat;
namespace TestApplication
{

2
Tests/Perspex.Controls.UnitTests/ContentControlTests.cs

@ -273,7 +273,7 @@ namespace Perspex.Controls.UnitTests
private ControlTemplate GetTemplate()
{
return ControlTemplate.Create<ContentControl>(parent =>
return new ControlTemplate<ContentControl>(parent =>
{
return new Border
{

7
Tests/Perspex.Controls.UnitTests/DeckTests.cs

@ -6,9 +6,10 @@
namespace Perspex.Controls.UnitTests
{
using System.Linq;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.LogicalTree;
using System.Linq;
using Xunit;
public class DeckTests
@ -18,7 +19,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new Deck
{
Template = ControlTemplate.Create<Deck>(this.CreateTemplate),
Template = new ControlTemplate<Deck>(this.CreateTemplate),
Items = new[]
{
"Foo",
@ -36,7 +37,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new Deck
{
Template = ControlTemplate.Create<Deck>(this.CreateTemplate),
Template = new ControlTemplate<Deck>(this.CreateTemplate),
Items = new[]
{
"Foo",

2
Tests/Perspex.Controls.UnitTests/DropDownTests.cs

@ -39,7 +39,7 @@ namespace Perspex.Controls.UnitTests
private ControlTemplate GetTemplate()
{
return ControlTemplate.Create<DropDown>(parent =>
return new ControlTemplate<DropDown>(parent =>
{
return new Panel
{

2
Tests/Perspex.Controls.UnitTests/ItemsControlTests.cs

@ -293,7 +293,7 @@ namespace Perspex.Controls.UnitTests
private ControlTemplate GetTemplate()
{
return ControlTemplate.Create<ItemsControl>(parent =>
return new ControlTemplate<ItemsControl>(parent =>
{
return new Border
{

1
Tests/Perspex.Controls.UnitTests/ListBoxTests.cs

@ -10,6 +10,7 @@ namespace Perspex.Controls.UnitTests
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.LogicalTree;
using Perspex.Styling;
using Xunit;

8
Tests/Perspex.Controls.UnitTests/Primitives/ScrollBarTests.cs

@ -19,7 +19,7 @@ namespace Perspex.Controls.UnitTests.Primitives
{
var target = new ScrollBar
{
Template = ControlTemplate.Create<ScrollBar>(Template),
Template = new ControlTemplate<ScrollBar>(Template),
};
target.ApplyTemplate();
@ -34,7 +34,7 @@ namespace Perspex.Controls.UnitTests.Primitives
{
var target = new ScrollBar
{
Template = ControlTemplate.Create<ScrollBar>(Template),
Template = new ControlTemplate<ScrollBar>(Template),
};
target.ApplyTemplate();
@ -49,7 +49,7 @@ namespace Perspex.Controls.UnitTests.Primitives
{
var target = new ScrollBar
{
Template = ControlTemplate.Create<ScrollBar>(Template),
Template = new ControlTemplate<ScrollBar>(Template),
};
target.ApplyTemplate();
@ -127,7 +127,7 @@ namespace Perspex.Controls.UnitTests.Primitives
[!Track.OrientationProperty] = control[!ScrollBar.OrientationProperty],
Thumb = new Thumb
{
Template = ControlTemplate.Create<Thumb>(ThumbTemplate),
Template = new ControlTemplate<Thumb>(ThumbTemplate),
},
},
};

3
Tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs

@ -9,6 +9,7 @@ namespace Perspex.Controls.UnitTests.Primitives
using Perspex.Collections;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Interactivity;
using Xunit;
@ -371,7 +372,7 @@ namespace Perspex.Controls.UnitTests.Primitives
private ControlTemplate Template()
{
return ControlTemplate.Create<Target>(control =>
return new ControlTemplate<Target>(control =>
new ItemsPresenter
{
Name = "itemsPresenter",

6
Tests/Perspex.Controls.UnitTests/ScrollViewerTests.cs

@ -22,7 +22,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new ScrollViewer
{
Template = ControlTemplate.Create<ScrollViewer>(this.CreateTemplate),
Template = new ControlTemplate<ScrollViewer>(this.CreateTemplate),
Content = "Foo",
};
@ -38,7 +38,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new ContentControl
{
Template = ControlTemplate.Create<ContentControl>(this.CreateNestedTemplate),
Template = new ControlTemplate<ContentControl>(this.CreateNestedTemplate),
Content = "Foo",
};
@ -104,7 +104,7 @@ namespace Perspex.Controls.UnitTests
{
return new ScrollViewer
{
Template = ControlTemplate.Create<ScrollViewer>(this.CreateTemplate),
Template = new ControlTemplate<ScrollViewer>(this.CreateTemplate),
Content = new ContentPresenter
{
Name = "this"

16
Tests/Perspex.Controls.UnitTests/TabControlTests.cs

@ -6,11 +6,11 @@
namespace Perspex.Controls.UnitTests
{
using System.Linq;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.LogicalTree;
using System.Linq;
using Xunit;
public class TabControlTests
@ -21,7 +21,7 @@ namespace Perspex.Controls.UnitTests
TabItem selected;
var target = new TabControl
{
Template = ControlTemplate.Create<TabControl>(this.CreateTabControlTemplate),
Template = new ControlTemplate<TabControl>(this.CreateTabControlTemplate),
Items = new[]
{
(selected = new TabItem
@ -49,7 +49,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new TabControl
{
Template = ControlTemplate.Create<TabControl>(this.CreateTabControlTemplate),
Template = new ControlTemplate<TabControl>(this.CreateTabControlTemplate),
Items = new[]
{
new TabItem
@ -74,7 +74,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new TabControl
{
Template = ControlTemplate.Create<TabControl>(this.CreateTabControlTemplate),
Template = new ControlTemplate<TabControl>(this.CreateTabControlTemplate),
Items = new[]
{
new TabItem
@ -99,7 +99,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new TabControl
{
Template = ControlTemplate.Create<TabControl>(this.CreateTabControlTemplate),
Template = new ControlTemplate<TabControl>(this.CreateTabControlTemplate),
Items = new[]
{
new TabItem
@ -128,17 +128,17 @@ namespace Perspex.Controls.UnitTests
new TabStrip
{
Name = "tabStrip",
Template = ControlTemplate.Create<TabStrip>(this.CreateTabStripTemplate),
Template = new ControlTemplate<TabStrip>(this.CreateTabStripTemplate),
[~TabStrip.ItemsProperty] = parent[~TabControl.ItemsProperty],
[~~TabStrip.SelectedTabProperty] = parent[~~TabControl.SelectedTabProperty]
},
new Deck
{
Name = "deck",
Template = ControlTemplate.Create<Deck>(this.CreateDeckTemplate),
Template = new ControlTemplate<Deck>(this.CreateDeckTemplate),
DataTemplates = new DataTemplates
{
new DataTemplate<TabItem>(x => parent.MaterializeDataTemplate(x.Content)),
new DataTemplate<TabItem>(x => (Control)parent.MaterializeDataTemplate(x.Content)),
},
[~Deck.ItemsProperty] = parent[~TabControl.ItemsProperty],
[~Deck.SelectedItemProperty] = parent[~TabControl.SelectedItemProperty],

9
Tests/Perspex.Controls.UnitTests/TabStripTests.cs

@ -9,8 +9,7 @@ namespace Perspex.Controls.UnitTests
using System.Linq;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.LogicalTree;
using Perspex.Styling;
using Perspex.Controls.Templates;
using Xunit;
public class TabStripTests
@ -20,7 +19,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new TabStrip
{
Template = ControlTemplate.Create<TabStrip>(this.CreateTabStripTemplate),
Template = new ControlTemplate<TabStrip>(this.CreateTabStripTemplate),
Items = new[]
{
new TabItem
@ -45,7 +44,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new TabStrip
{
Template = ControlTemplate.Create<TabStrip>(this.CreateTabStripTemplate),
Template = new ControlTemplate<TabStrip>(this.CreateTabStripTemplate),
Items = new[]
{
new TabItem
@ -70,7 +69,7 @@ namespace Perspex.Controls.UnitTests
{
var target = new TabStrip
{
Template = ControlTemplate.Create<TabStrip>(this.CreateTabStripTemplate),
Template = new ControlTemplate<TabStrip>(this.CreateTabStripTemplate),
Items = new[]
{
new TabItem

9
Tests/Perspex.Controls.UnitTests/TopLevelTests.cs

@ -6,8 +6,11 @@
namespace Perspex.Controls.UnitTests
{
using System.Reactive;
using System.Reactive.Subjects;
using Moq;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Input.Raw;
using Perspex.Layout;
@ -17,8 +20,6 @@ namespace Perspex.Controls.UnitTests
using Ploeh.AutoFixture;
using Ploeh.AutoFixture.AutoMoq;
using Splat;
using System.Reactive;
using System.Reactive.Subjects;
using Xunit;
public class TopLevelTests
@ -99,7 +100,7 @@ namespace Perspex.Controls.UnitTests
var target = new TestTopLevel(impl.Object)
{
Template = ControlTemplate.Create<TestTopLevel>(x =>
Template = new ControlTemplate<TestTopLevel>(x =>
new ContentPresenter
{
[~ContentPresenter.ContentProperty] = x[~TestTopLevel.ContentProperty],
@ -129,7 +130,7 @@ namespace Perspex.Controls.UnitTests
var target = new TestTopLevel(impl.Object)
{
Template = ControlTemplate.Create<TestTopLevel>(x =>
Template = new ControlTemplate<TestTopLevel>(x =>
new ContentPresenter
{
[~ContentPresenter.ContentProperty] = x[~TestTopLevel.ContentProperty],

1
Tests/Perspex.Styling.UnitTests/SelectorTests_Multiple.cs

@ -10,6 +10,7 @@ namespace Perspex.Styling.UnitTests
using System.Collections.Generic;
using System.Linq;
using Perspex.Controls;
using Perspex.Controls.Templates;
using Perspex.Styling;
using Xunit;

Loading…
Cancel
Save