Browse Source

Descendent selector WIP.

pull/4/head
Steven Kirk 12 years ago
parent
commit
39bbe8464f
  1. 5
      Perspex.UnitTests/Perspex.UnitTests.csproj
  2. 10
      Perspex.UnitTests/StyleTests.cs
  3. 20
      Perspex.UnitTests/Styling/SelectorTests_Class.cs
  4. 55
      Perspex.UnitTests/Styling/SelectorTests_Descendent.cs
  5. 20
      Perspex.UnitTests/Styling/SelectorTests_Id.cs
  6. 20
      Perspex.UnitTests/Styling/SelectorTests_OfType.cs
  7. 45
      Perspex.UnitTests/Styling/SelectorTests_Template.cs
  8. 25
      Perspex.UnitTests/Styling/TestControlBase.cs
  9. 31
      Perspex.UnitTests/Styling/TestLogical.cs
  10. 23
      Perspex.UnitTests/Styling/TestObservable.cs
  11. 21
      Perspex.UnitTests/Styling/TestSelectors.cs
  12. 37
      Perspex.UnitTests/Styling/TestTemplatedControl.cs
  13. 2
      Perspex/Perspex.csproj
  14. 4
      Perspex/Styling/Activator.cs
  15. 43
      Perspex/Styling/Selector.cs
  16. 39
      Perspex/Styling/Selectors.cs
  17. 17
      Perspex/Styling/Style.cs
  18. 60
      Perspex/Themes/Default/ButtonStyle.cs

5
Perspex.UnitTests/Perspex.UnitTests.csproj

@ -75,7 +75,12 @@
<Compile Include="Styling\SelectorTests_Class.cs" />
<Compile Include="Styling\SelectorTests_Id.cs" />
<Compile Include="Styling\SelectorTests_OfType.cs" />
<Compile Include="Styling\SelectorTests_Descendent.cs" />
<Compile Include="Styling\SelectorTests_Template.cs" />
<Compile Include="Styling\TestLogical.cs" />
<Compile Include="Styling\TestTemplatedControl.cs" />
<Compile Include="Styling\TestSelectors.cs" />
<Compile Include="Styling\TestObservable.cs" />
<Compile Include="Styling\TestControlBase.cs" />
</ItemGroup>
<ItemGroup>

10
Perspex.UnitTests/StyleTests.cs

@ -18,7 +18,7 @@ namespace Perspex.UnitTests
[TestMethod]
public void Style_With_Only_Type_Selector_Should_Update_Value()
{
Style style = new Style(x => x.Select().OfType<Class1>())
Style style = new Style(new Selector().OfType<Class1>())
{
Setters = new[]
{
@ -36,7 +36,7 @@ namespace Perspex.UnitTests
[TestMethod]
public void Style_With_Class_Selector_Should_Update_And_Restore_Value()
{
Style style = new Style(x => x.Select().OfType<Class1>().Class("foo"))
Style style = new Style(new Selector().OfType<Class1>().Class("foo"))
{
Setters = new[]
{
@ -57,7 +57,7 @@ namespace Perspex.UnitTests
[TestMethod]
public void LocalValue_Should_Override_Style()
{
Style style = new Style(x => x.Select().OfType<Class1>())
Style style = new Style(new Selector().OfType<Class1>())
{
Setters = new[]
{
@ -79,7 +79,7 @@ namespace Perspex.UnitTests
{
Styles styles = new Styles
{
new Style(x => x.Select().OfType<Class1>().Class("foo"))
new Style(new Selector().OfType<Class1>().Class("foo"))
{
Setters = new[]
{
@ -87,7 +87,7 @@ namespace Perspex.UnitTests
},
},
new Style(x => x.Select().OfType<Class1>().Class("foo"))
new Style(new Selector().OfType<Class1>().Class("foo"))
{
Setters = new[]
{

20
Perspex.UnitTests/Styling/SelectorTests_Class.cs

@ -24,9 +24,9 @@ namespace Perspex.UnitTests.Styling
Classes = new Classes { "foo" },
};
var target = control.Select().Class("foo");
var target = new Selector().Class("foo");
CollectionAssert.AreEqual(new[] { true }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { true }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
@ -37,9 +37,9 @@ namespace Perspex.UnitTests.Styling
Classes = new Classes { "bar" },
};
var target = control.Select().Class("foo");
var target = new Selector().Class("foo");
CollectionAssert.AreEqual(new[] { false }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { false }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
@ -51,9 +51,9 @@ namespace Perspex.UnitTests.Styling
TemplatedParent = new Mock<ITemplatedControl>().Object,
};
var target = control.Select().Class("foo");
var target = new Selector().Class("foo");
CollectionAssert.AreEqual(new[] { false }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { false }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
@ -61,8 +61,8 @@ namespace Perspex.UnitTests.Styling
{
var control = new Control1();
var target = control.Select().Class("foo");
var activator = target.GetActivator();
var target = new Selector().Class("foo");
var activator = target.GetActivator(control);
CollectionAssert.AreEqual(new[] { false }, activator.Take(1).ToEnumerable().ToArray());
control.Classes.Add("foo");
@ -77,8 +77,8 @@ namespace Perspex.UnitTests.Styling
Classes = new Classes { "foo" },
};
var target = control.Select().Class("foo");
var activator = target.GetActivator();
var target = new Selector().Class("foo");
var activator = target.GetActivator(control);
CollectionAssert.AreEqual(new[] { true }, activator.Take(1).ToEnumerable().ToArray());
control.Classes.Remove("foo");

55
Perspex.UnitTests/Styling/SelectorTests_Descendent.cs

@ -0,0 +1,55 @@
// -----------------------------------------------------------------------
// <copyright file="SelectorTests_Descendent.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.UnitTests.Styling
{
using System.Linq;
using System.Reactive.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Perspex.Controls;
using Perspex.Styling;
using Match = Perspex.Styling.Selector;
[TestClass]
public class SelectorTests_Descendent
{
[TestMethod]
public void Descendent_Matches_Control_When_It_Is_Child_OfType()
{
var parent = new Mock<TestLogical1>();
var child = new Mock<TestLogical2>();
parent.Setup(x => x.LogicalChildren).Returns(new[]
{
child.Object,
});
var selector = new Selector().OfType<TestLogical1>().Descendent().OfType<TestLogical2>();
Assert.AreEqual(true, ActivatorValue(selector, child.Object));
}
[TestMethod]
public void Descendent_Matches_Control_When_It_Is_Descendent_OfType()
{
Assert.Fail();
}
private static bool ActivatorValue(Match selector, IStyleable control)
{
return selector.GetActivator(control).Take(1).ToEnumerable().Single();
}
public abstract class TestLogical1 : TestLogical
{
}
public abstract class TestLogical2 : TestLogical
{
}
}
}

20
Perspex.UnitTests/Styling/SelectorTests_Id.cs

@ -22,36 +22,36 @@ namespace Perspex.UnitTests.Styling
public void Id_Matches_Control_With_Correct_Id()
{
var control = new Control1 { Id = "foo" };
var target = control.Select().Id("foo");
var target = new Selector().Id("foo");
CollectionAssert.AreEqual(new[] { true }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { true }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
public void Id_Doesnt_Match_Control_Of_Wrong_Id()
{
var control = new Control1 { Id = "foo" };
var target = control.Select().Id("bar");
var target = new Selector().Id("bar");
CollectionAssert.AreEqual(new[] { false }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { false }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
public void Id_Doesnt_Match_Control_With_TemplatedParent()
{
var control = new Control1 { TemplatedParent = new Mock<ITemplatedControl>().Object };
var target = control.Select().Id("foo");
var target = new Selector().Id("foo");
CollectionAssert.AreEqual(new[] { false }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { false }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
public void When_Id_Matches_Control_Other_Selectors_Are_Subscribed()
{
var control = new Control1 { Id = "foo" };
var target = control.Select().Id("foo").SubscribeCheck();
var target = new Selector().Id("foo").SubscribeCheck();
var result = target.GetActivator().ToEnumerable().Take(1).ToArray();
var result = target.GetActivator(control).ToEnumerable().Take(1).ToArray();
Assert.AreEqual(1, control.SubscribeCheckObservable.SubscribedCount);
}
@ -60,9 +60,9 @@ namespace Perspex.UnitTests.Styling
public void When_Id_Doesnt_Match_Control_Other_Selectors_Are_Not_Subscribed()
{
var control = new Control1 { Id = "foo" };
var target = control.Select().Id("bar").SubscribeCheck();
var target = new Selector().Id("bar").SubscribeCheck();
var result = target.GetActivator().ToEnumerable().Take(1).ToArray();
var result = target.GetActivator(control).ToEnumerable().Take(1).ToArray();
Assert.AreEqual(0, control.SubscribeCheckObservable.SubscribedCount);
}

20
Perspex.UnitTests/Styling/SelectorTests_OfType.cs

@ -20,36 +20,36 @@ namespace Perspex.UnitTests.Styling
public void OfType_Matches_Control_Of_Correct_Type()
{
var control = new Control1();
var target = control.Select().OfType<Control1>();
var target = new Selector().OfType<Control1>();
CollectionAssert.AreEqual(new[] { true }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { true }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
public void OfType_Doesnt_Match_Control_Of_Wrong_Type()
{
var control = new Control2();
var target = control.Select().OfType<Control1>();
var target = new Selector().OfType<Control1>();
CollectionAssert.AreEqual(new[] { false }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { false }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
public void OfType_Doesnt_Match_Control_With_TemplatedParent()
{
var control = new Control1 { TemplatedParent = new Mock<ITemplatedControl>().Object };
var target = control.Select().OfType<Control1>();
var target = new Selector().OfType<Control1>();
CollectionAssert.AreEqual(new[] { false }, target.GetActivator().Take(1).ToEnumerable().ToArray());
CollectionAssert.AreEqual(new[] { false }, target.GetActivator(control).Take(1).ToEnumerable().ToArray());
}
[TestMethod]
public void When_OfType_Matches_Control_Other_Selectors_Are_Subscribed()
{
var control = new Control1();
var target = control.Select().OfType<Control1>().SubscribeCheck();
var target = new Selector().OfType<Control1>().SubscribeCheck();
var result = target.GetActivator().ToEnumerable().Take(1).ToArray();
var result = target.GetActivator(control).ToEnumerable().Take(1).ToArray();
Assert.AreEqual(1, control.SubscribeCheckObservable.SubscribedCount);
}
@ -58,9 +58,9 @@ namespace Perspex.UnitTests.Styling
public void When_OfType_Doesnt_Match_Control_Other_Selectors_Are_Not_Subscribed()
{
var control = new Control1();
var target = control.Select().OfType<Control2>().SubscribeCheck();
var target = new Selector().OfType<Control2>().SubscribeCheck();
var result = target.GetActivator().ToEnumerable().Take(1).ToArray();
var result = target.GetActivator(control).ToEnumerable().Take(1).ToArray();
Assert.AreEqual(0, control.SubscribeCheckObservable.SubscribedCount);
}

45
Perspex.UnitTests/Styling/SelectorTests_Template.cs

@ -12,7 +12,7 @@ namespace Perspex.UnitTests.Styling
using Moq;
using Perspex.Controls;
using Perspex.Styling;
using Match = Perspex.Styling.Match;
using Match = Perspex.Styling.Selector;
[TestClass]
public class SelectorTests_Template
@ -25,9 +25,10 @@ namespace Perspex.UnitTests.Styling
this.BuildVisualTree(templatedControl);
var border = (Border)templatedControl.Object.VisualChildren.Single();
var selector = border.Select().OfType<Border>();
Assert.AreEqual(false, ActivatorValue(selector));
var selector = new Selector().OfType<Border>();
Assert.AreEqual(false, ActivatorValue(selector, border));
}
[TestMethod]
@ -38,17 +39,45 @@ namespace Perspex.UnitTests.Styling
this.BuildVisualTree(templatedControl);
var border = (Border)templatedControl.Object.VisualChildren.Single();
var selector = border.Select().Template().OfType<Border>();
Assert.AreEqual(true, ActivatorValue(selector));
var selector = new Selector().Template().OfType<Border>();
Assert.AreEqual(true, ActivatorValue(selector, border));
}
[TestMethod]
public void Nested_Control_In_Template_Is_Matched_With_Template_Selector()
{
var templatedControl = new Mock<ITemplatedControl>();
var styleable = templatedControl.As<IStyleable>();
this.BuildVisualTree(templatedControl);
var textBlock = (TextBlock)templatedControl.Object.VisualChildren.Single().VisualChildren.Single();
var selector = new Selector().Template().OfType<TextBlock>();
Assert.AreEqual(true, ActivatorValue(selector, textBlock));
}
[TestMethod]
public void Control_In_Template_Is_Matched_With_TypeOf_TemplatedControl()
{
var templatedControl = new Mock<TestTemplatedControl>();
this.BuildVisualTree(templatedControl);
var border = (Border)templatedControl.Object.VisualChildren.Single();
var selector = new Selector().OfType<TestTemplatedControl>().Template().OfType<Border>();
Assert.AreEqual(true, ActivatorValue(selector,border));
}
private static bool ActivatorValue(Match selector)
private static bool ActivatorValue(Match selector, IStyleable control)
{
return selector.GetActivator().Take(1).ToEnumerable().Single();
return selector.GetActivator(control).Take(1).ToEnumerable().Single();
}
private void BuildVisualTree(Mock<ITemplatedControl> templatedControl)
private void BuildVisualTree<T>(Mock<T> templatedControl) where T : class, ITemplatedControl
{
templatedControl.Setup(x => x.VisualChildren).Returns(new[]
{

25
Perspex.UnitTests/Styling/TestControlBase.cs

@ -7,22 +7,8 @@
namespace Perspex.UnitTests.Styling
{
using System;
using System.Reactive.Disposables;
using Perspex.Controls;
using Perspex.Styling;
using Match = Perspex.Styling.Match;
public class TestObservable : IObservable<bool>
{
public int SubscribedCount { get; private set; }
public IDisposable Subscribe(IObserver<bool> observer)
{
++this.SubscribedCount;
observer.OnNext(true);
return Disposable.Create(() => --this.SubscribedCount);
}
}
public class TestControlBase : IStyleable
{
@ -48,15 +34,4 @@ namespace Perspex.UnitTests.Styling
{
}
}
public static class TestSelectors
{
public static Match SubscribeCheck(this Match match)
{
return new Match(match)
{
Observable = ((TestControlBase)match.Control).SubscribeCheckObservable,
};
}
}
}

31
Perspex.UnitTests/Styling/TestLogical.cs

@ -0,0 +1,31 @@
// -----------------------------------------------------------------------
// <copyright file="SubscribeCheck.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.UnitTests.Styling
{
using System;
using System.Collections.Generic;
using Perspex.Controls;
using Perspex.Styling;
public abstract class TestLogical : TestControlBase, ILogical
{
public TestLogical()
{
}
public abstract ILogical LogicalParent
{
get;
set;
}
public abstract IEnumerable<ILogical> LogicalChildren
{
get;
}
}
}

23
Perspex.UnitTests/Styling/TestObservable.cs

@ -0,0 +1,23 @@
// -----------------------------------------------------------------------
// <copyright file="SubscribeCheck.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.UnitTests.Styling
{
using System;
using System.Reactive.Disposables;
public class TestObservable : IObservable<bool>
{
public int SubscribedCount { get; private set; }
public IDisposable Subscribe(IObserver<bool> observer)
{
++this.SubscribedCount;
observer.OnNext(true);
return Disposable.Create(() => --this.SubscribedCount);
}
}
}

21
Perspex.UnitTests/Styling/TestSelectors.cs

@ -0,0 +1,21 @@
// -----------------------------------------------------------------------
// <copyright file="SubscribeCheck.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.UnitTests.Styling
{
using Perspex.Styling;
public static class TestSelectors
{
public static Selector SubscribeCheck(this Selector selector)
{
return new Selector(selector)
{
Observable = control => ((TestControlBase)control).SubscribeCheckObservable,
};
}
}
}

37
Perspex.UnitTests/Styling/TestTemplatedControl.cs

@ -0,0 +1,37 @@
// -----------------------------------------------------------------------
// <copyright file="SubscribeCheck.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.UnitTests.Styling
{
using System.Collections.Generic;
using Perspex.Controls;
using Perspex.Styling;
public abstract class TestTemplatedControl : ITemplatedControl, IStyleable
{
public abstract Classes Classes
{
get;
}
public abstract string Id
{
get;
}
public abstract ITemplatedControl TemplatedParent
{
get;
}
public abstract IEnumerable<IVisual> VisualChildren
{
get;
}
public abstract void SetValue(PerspexProperty property, object value, System.IObservable<bool> activator);
}
}

2
Perspex/Perspex.csproj

@ -107,7 +107,7 @@
<Compile Include="PerspexPropertyChangedEventArgs.cs" />
<Compile Include="Point.cs" />
<Compile Include="ReadOnlyPerspexProperty.cs" />
<Compile Include="Styling\Match.cs" />
<Compile Include="Styling\Selector.cs" />
<Compile Include="RoutedEventArgs.cs" />
<Compile Include="Styling\Selectors.cs" />
<Compile Include="ServiceLocator.cs" />

4
Perspex/Styling/Activator.cs

@ -21,7 +21,7 @@ namespace Perspex.Styling
bool last = false;
public Activator(Match match)
public Activator(Selector match, IStyleable control)
{
int i = 0;
@ -33,7 +33,7 @@ namespace Perspex.Styling
{
this.values.Add(false);
IDisposable subscription = match.Observable.Subscribe(
IDisposable subscription = match.Observable(control).Subscribe(
x => this.Update(iCaptured, x),
x => this.Finish(iCaptured),
() => this.Finish(iCaptured));

43
Perspex/Styling/Match.cs → Perspex/Styling/Selector.cs

@ -13,35 +13,20 @@ namespace Perspex.Styling
using System.Text;
using Perspex.Controls;
public class Match
public class Selector
{
private IObservable<bool> observable;
private Func<IStyleable, IObservable<bool>> observable;
public Match(IStyleable control)
public Selector()
{
this.Control = control;
}
public Match(Match previous)
public Selector(Selector previous)
{
this.Control = previous.Control;
this.InTemplate = previous.InTemplate;
this.Previous = previous;
}
public IStyleable Control
{
get;
private set;
}
public bool InTemplate
{
get;
set;
}
public IObservable<bool> Observable
public Func<IStyleable, IObservable<bool>> Observable
{
get
{
@ -50,19 +35,11 @@ namespace Perspex.Styling
set
{
if ((!InTemplate && Control.TemplatedParent == null) ||
(InTemplate && Control.TemplatedParent != null))
{
this.observable = value;
}
else
{
this.observable = System.Reactive.Linq.Observable.Return(false);
}
this.observable = value;
}
}
public Match Previous
public Selector Previous
{
get;
set;
@ -74,14 +51,14 @@ namespace Perspex.Styling
set;
}
public Activator GetActivator()
public Activator GetActivator(IStyleable control)
{
return new Activator(this);
return new Activator(this, control);
}
public override string ToString()
{
Match match = this;
Selector match = this;
StringBuilder b = new StringBuilder();
while (match != null)

39
Perspex/Styling/Selectors.cs

@ -12,56 +12,53 @@ namespace Perspex.Styling
public static class Selectors
{
public static Match Select(this IStyleable control)
{
Contract.Requires<ArgumentNullException>(control != null);
return new Match(control);
}
public static Match Class(this Match match, string name)
public static Selector Class(this Selector match, string name)
{
Contract.Requires<ArgumentNullException>(match != null);
Contract.Requires<ArgumentNullException>(name != null);
return new Match(match)
return new Selector(match)
{
Observable = Observable
.Return(match.Control.Classes.Contains(name))
.Concat(match.Control.Classes.Changed.Select(e => match.Control.Classes.Contains(name))),
Observable = control => Observable
.Return(control.Classes.Contains(name))
.Concat(control.Classes.Changed.Select(e => control.Classes.Contains(name))),
SelectorString = (name[0] == ':') ? name : '.' + name,
};
}
public static Match Id(this Match match, string id)
public static Selector Descendent(this Selector match)
{
throw new NotImplementedException();
}
public static Selector Id(this Selector match, string id)
{
Contract.Requires<ArgumentNullException>(match != null);
return new Match(match)
return new Selector(match)
{
Observable = Observable.Return(match.Control.TemplatedParent == null && match.Control.Id == id),
Observable = control => Observable.Return(control.Id == id),
SelectorString = '#' + id,
};
}
public static Match OfType<T>(this Match match) where T : IStyleable
public static Selector OfType<T>(this Selector match) where T : IStyleable
{
Contract.Requires<ArgumentNullException>(match != null);
return new Match(match)
return new Selector(match)
{
Observable = Observable.Return(match.Control is T),
Observable = control => Observable.Return(control is T),
SelectorString = typeof(T).Name,
};
}
public static Match Template(this Match match)
public static Selector Template(this Selector match)
{
Contract.Requires<ArgumentNullException>(match != null);
return new Match(match)
return new Selector(match)
{
InTemplate = true,
SelectorString = " $ ",
};
}

17
Perspex/Styling/Style.cs

@ -20,13 +20,13 @@ namespace Perspex.Styling
this.Setters = new List<Setter>();
}
public Style(Func<IStyleable, Match> selector)
public Style(Selector selector)
: this()
{
this.Selector = selector;
}
public Func<IStyleable, Match> Selector
public Selector Selector
{
get;
set;
@ -40,17 +40,12 @@ namespace Perspex.Styling
public void Attach(IStyleable control)
{
Match match = this.Selector(control);
string description = "Style " + this.Selector.ToString();
IObservable<bool> activator = this.Selector.GetActivator(control);
if (match != null)
foreach (Setter setter in this.Setters)
{
string description = "Style " + match.ToString();
IObservable<bool> activator = match.GetActivator();
foreach (Setter setter in this.Setters)
{
control.SetValue(setter.Property, setter.Value, activator);
}
control.SetValue(setter.Property, setter.Value, activator);
}
}
}

60
Perspex/Themes/Default/ButtonStyle.cs

@ -13,36 +13,36 @@ namespace Perspex.Themes.Default
{
public ButtonStyle()
{
this.AddRange(new[]
{
new Style(x => x.Select().OfType<Button>())
{
Setters = new[]
{
new Setter(Button.BackgroundProperty, new SolidColorBrush(0xffdddddd)),
new Setter(Button.BorderBrushProperty, new SolidColorBrush(0xff707070)),
new Setter(Button.BorderThicknessProperty, 2.0),
new Setter(Button.ForegroundProperty, new SolidColorBrush(0xff000000)),
new Setter(Button.TemplateProperty, ControlTemplate.Create<Button>(this.Template)),
},
},
new Style(x => x.Select().OfType<Button>().Class(":mouseover"))
{
Setters = new[]
{
new Setter (Button.BackgroundProperty, new SolidColorBrush(0xffbee6fd)),
new Setter (Button.BorderBrushProperty, new SolidColorBrush(0xff3c7fb1)),
},
},
new Style(x => x.Select().OfType<Button>().Class(":pressed"))
{
Setters = new[]
{
new Setter (Button.BackgroundProperty, new SolidColorBrush(0xffc4e5f6)),
new Setter (Button.BorderBrushProperty, new SolidColorBrush(0xff2c628b)),
},
},
});
//this.AddRange(new[]
//{
// new Style(x => x.OfType<Button>())
// {
// Setters = new[]
// {
// new Setter(Button.BackgroundProperty, new SolidColorBrush(0xffdddddd)),
// new Setter(Button.BorderBrushProperty, new SolidColorBrush(0xff707070)),
// new Setter(Button.BorderThicknessProperty, 2.0),
// new Setter(Button.ForegroundProperty, new SolidColorBrush(0xff000000)),
// new Setter(Button.TemplateProperty, ControlTemplate.Create<Button>(this.Template)),
// },
// },
// new Style(x => x.OfType<Button>().Class(":mouseover"))
// {
// Setters = new[]
// {
// new Setter (Button.BackgroundProperty, new SolidColorBrush(0xffbee6fd)),
// new Setter (Button.BorderBrushProperty, new SolidColorBrush(0xff3c7fb1)),
// },
// },
// new Style(x => x.OfType<Button>().Class(":pressed"))
// {
// Setters = new[]
// {
// new Setter (Button.BackgroundProperty, new SolidColorBrush(0xffc4e5f6)),
// new Setter (Button.BorderBrushProperty, new SolidColorBrush(0xff2c628b)),
// },
// },
//});
}
private Control Template(Button control)

Loading…
Cancel
Save