Browse Source

Added StyleTrigger binding priority.

This allows :mouseover etc to override the value that comes from the
templated parent.
pull/4/head
Steven Kirk 13 years ago
parent
commit
486863f795
  1. 2
      Perspex.UnitTests/Controls/ContentControlTests.cs
  2. 9
      Perspex.UnitTests/Styling/SelectorTests_Class.cs
  3. 9
      Perspex.UnitTests/Styling/SelectorTests_Id.cs
  4. 9
      Perspex.UnitTests/Styling/SelectorTests_OfType.cs
  5. 19
      Perspex/PerspexObject.cs
  6. 16
      Perspex/Styling/Selector.cs
  7. 2
      Perspex/Styling/Selectors.cs
  8. 2
      Perspex/Styling/Style.cs
  9. 4
      Perspex/Themes/Default/ButtonStyle.cs

2
Perspex.UnitTests/Controls/ContentControlTests.cs

@ -74,7 +74,7 @@ namespace Perspex.UnitTests.Controls
contentPresenter.Bind( contentPresenter.Bind(
ContentPresenter.ContentProperty, ContentPresenter.ContentProperty,
parent.GetObservable(ContentControl.ContentProperty), parent.GetObservable(ContentControl.ContentProperty),
BindingPriority.Template); BindingPriority.TemplatedParent);
border.Content = contentPresenter; border.Content = contentPresenter;
return border; return border;
}); });

9
Perspex.UnitTests/Styling/SelectorTests_Class.cs

@ -16,6 +16,15 @@ namespace Perspex.UnitTests.Styling
[TestClass] [TestClass]
public class SelectorTests_Class public class SelectorTests_Class
{ {
[TestMethod]
public void Class_Priority_Is_StyleTrigger()
{
var control = new Control1();
var target = new Selector().Class("foo");
Assert.AreEqual(BindingPriority.StyleTrigger, target.Priority);
}
[TestMethod] [TestMethod]
public void Class_Matches_Control_With_Class() public void Class_Matches_Control_With_Class()
{ {

9
Perspex.UnitTests/Styling/SelectorTests_Id.cs

@ -18,6 +18,15 @@ namespace Perspex.UnitTests.Styling
[TestClass] [TestClass]
public class SelectorTests_Id public class SelectorTests_Id
{ {
[TestMethod]
public void Id_Priority_Is_Style()
{
var control = new Control1();
var target = new Selector().Id("foo");
Assert.AreEqual(BindingPriority.Style, target.Priority);
}
[TestMethod] [TestMethod]
public void Id_Matches_Control_With_Correct_Id() public void Id_Matches_Control_With_Correct_Id()
{ {

9
Perspex.UnitTests/Styling/SelectorTests_OfType.cs

@ -16,6 +16,15 @@ namespace Perspex.UnitTests.Styling
[TestClass] [TestClass]
public class SelectorTests_OfType public class SelectorTests_OfType
{ {
[TestMethod]
public void OfType_Priority_Is_Style()
{
var control = new Control1();
var target = new Selector().OfType<Control1>();
Assert.AreEqual(BindingPriority.Style, target.Priority);
}
[TestMethod] [TestMethod]
public void OfType_Matches_Control_Of_Correct_Type() public void OfType_Matches_Control_Of_Correct_Type()
{ {

19
Perspex/PerspexObject.cs

@ -24,14 +24,25 @@ namespace Perspex
LocalValue, LocalValue,
/// <summary> /// <summary>
/// A style binding. /// A triggered style binding.
/// </summary> /// </summary>
Style, /// <remarks>
/// A style trigger is a selector such as .class which overrides a
/// <see cref="TemplatedParent"/> binding. In this way, a basic control can have
/// for example a Background from the templated parent which changes when the
/// control has the :mouseover class.
/// </remarks>
StyleTrigger,
/// <summary> /// <summary>
/// A template binding. /// A binding to a property on the templated parent.
/// </summary> /// </summary>
Template, TemplatedParent,
/// <summary>
/// A style binding.
/// </summary>
Style,
} }
/// <summary> /// <summary>

16
Perspex/Styling/Selector.cs

@ -20,16 +20,26 @@ namespace Perspex.Styling
public Selector() public Selector()
{ {
this.GetObservable = _ => Observable.Return(true); this.GetObservable = _ => Observable.Return(true);
this.Priority = BindingPriority.Style;
} }
public Selector(Selector previous, bool stopTraversal = false) public Selector(Selector previous, bool stopTraversal = false)
: this() : this()
{ {
this.Previous = previous; this.Previous = previous;
this.Priority = previous.Priority;
this.InTemplate = previous != null ? previous.InTemplate : false; this.InTemplate = previous != null ? previous.InTemplate : false;
this.stopTraversal = stopTraversal; this.stopTraversal = stopTraversal;
} }
public Selector(Selector previous, BindingPriority priority)
: this()
{
this.Previous = previous;
this.Priority = priority;
this.InTemplate = previous != null ? previous.InTemplate : false;
}
public bool InTemplate public bool InTemplate
{ {
get; get;
@ -48,6 +58,12 @@ namespace Perspex.Styling
private set; private set;
} }
public BindingPriority Priority
{
get;
private set;
}
public string SelectorString public string SelectorString
{ {
get; get;

2
Perspex/Styling/Selectors.cs

@ -18,7 +18,7 @@ namespace Perspex.Styling
Contract.Requires<ArgumentNullException>(previous != null); Contract.Requires<ArgumentNullException>(previous != null);
Contract.Requires<ArgumentNullException>(name != null); Contract.Requires<ArgumentNullException>(name != null);
return new Selector(previous) return new Selector(previous, BindingPriority.StyleTrigger)
{ {
GetObservable = control => Observable GetObservable = control => Observable
.Return(control.Classes.Contains(name)) .Return(control.Classes.Contains(name))

2
Perspex/Styling/Style.cs

@ -48,7 +48,7 @@ namespace Perspex.Styling
foreach (Setter setter in this.Setters) foreach (Setter setter in this.Setters)
{ {
StyleBinding binding = new StyleBinding(activator, setter.Value, description); StyleBinding binding = new StyleBinding(activator, setter.Value, description);
control.Bind(setter.Property, binding, BindingPriority.Style); control.Bind(setter.Property, binding, this.Selector.Priority);
} }
} }
} }

4
Perspex/Themes/Default/ButtonStyle.cs

@ -59,13 +59,13 @@ namespace Perspex.Themes.Default
border.Bind( border.Bind(
Border.BackgroundProperty, Border.BackgroundProperty,
control.GetObservable(Button.BackgroundProperty), control.GetObservable(Button.BackgroundProperty),
BindingPriority.Template); BindingPriority.TemplatedParent);
ContentPresenter contentPresenter = new ContentPresenter(); ContentPresenter contentPresenter = new ContentPresenter();
contentPresenter.Bind( contentPresenter.Bind(
ContentPresenter.ContentProperty, ContentPresenter.ContentProperty,
control.GetObservable(Button.ContentProperty), control.GetObservable(Button.ContentProperty),
BindingPriority.Template); BindingPriority.TemplatedParent);
border.Content = contentPresenter; border.Content = contentPresenter;
return border; return border;

Loading…
Cancel
Save