diff --git a/src/Perspex.Styling/Styling/ChildSelector.cs b/src/Perspex.Styling/Styling/ChildSelector.cs index a968f68f1d..4cb675adc5 100644 --- a/src/Perspex.Styling/Styling/ChildSelector.cs +++ b/src/Perspex.Styling/Styling/ChildSelector.cs @@ -9,6 +9,7 @@ namespace Perspex.Styling internal class ChildSelector : Selector { private readonly Selector _parent; + private string _selectorString; public ChildSelector(Selector parent) { @@ -28,7 +29,12 @@ namespace Perspex.Styling public override string ToString() { - return _parent.ToString() + " > "; + if (_selectorString == null) + { + _selectorString = _parent.ToString() + " > "; + } + + return _selectorString; } protected override SelectorMatch Evaluate(IStyleable control, bool subscribe) diff --git a/src/Perspex.Styling/Styling/DescendentSelector.cs b/src/Perspex.Styling/Styling/DescendentSelector.cs index 0c5f1178c3..259147232f 100644 --- a/src/Perspex.Styling/Styling/DescendentSelector.cs +++ b/src/Perspex.Styling/Styling/DescendentSelector.cs @@ -10,6 +10,7 @@ namespace Perspex.Styling internal class DescendentSelector : Selector { private readonly Selector _parent; + private string _selectorString; public DescendentSelector(Selector parent) { @@ -29,7 +30,12 @@ namespace Perspex.Styling public override string ToString() { - return _parent.ToString() + ' '; + if (_selectorString == null) + { + _selectorString = _parent.ToString() + ' '; + } + + return _selectorString; } protected override SelectorMatch Evaluate(IStyleable control, bool subscribe) diff --git a/src/Perspex.Styling/Styling/PropertyEqualsSelector.cs b/src/Perspex.Styling/Styling/PropertyEqualsSelector.cs index b4c4c952c4..3df29dc280 100644 --- a/src/Perspex.Styling/Styling/PropertyEqualsSelector.cs +++ b/src/Perspex.Styling/Styling/PropertyEqualsSelector.cs @@ -16,6 +16,7 @@ namespace Perspex.Styling private readonly Selector _previous; private readonly PerspexProperty _property; private readonly object _value; + private string _selectorString; public PropertyEqualsSelector(Selector previous, PerspexProperty property, object value) { @@ -40,27 +41,32 @@ namespace Perspex.Styling /// public override string ToString() { - var builder = new StringBuilder(); - - if (_previous != null) + if (_selectorString == null) { - builder.Append(_previous.ToString()); - } + var builder = new StringBuilder(); - builder.Append('['); + if (_previous != null) + { + builder.Append(_previous.ToString()); + } - if (_property.IsAttached) - { - builder.Append(_property.OwnerType.Name); - builder.Append('.'); - } + builder.Append('['); - builder.Append(_property.Name); - builder.Append('='); - builder.Append(_value); - builder.Append(']'); + if (_property.IsAttached) + { + builder.Append(_property.OwnerType.Name); + builder.Append('.'); + } + + builder.Append(_property.Name); + builder.Append('='); + builder.Append(_value); + builder.Append(']'); + + _selectorString = builder.ToString(); + } - return builder.ToString(); + return _selectorString; } /// diff --git a/src/Perspex.Styling/Styling/TemplateSelector.cs b/src/Perspex.Styling/Styling/TemplateSelector.cs index effbabdc95..0f6efd84c3 100644 --- a/src/Perspex.Styling/Styling/TemplateSelector.cs +++ b/src/Perspex.Styling/Styling/TemplateSelector.cs @@ -8,6 +8,7 @@ namespace Perspex.Styling internal class TemplateSelector : Selector { private readonly Selector _parent; + private string _selectorString; public TemplateSelector(Selector parent) { @@ -27,7 +28,12 @@ namespace Perspex.Styling public override string ToString() { - return _parent.ToString() + " /template/ "; + if (_selectorString == null) + { + _selectorString = _parent.ToString() + " /template/ "; + } + + return _selectorString; } protected override SelectorMatch Evaluate(IStyleable control, bool subscribe) diff --git a/src/Perspex.Styling/Styling/TypeNameAndClassSelector.cs b/src/Perspex.Styling/Styling/TypeNameAndClassSelector.cs index b9121b1927..5cf07fcbf2 100644 --- a/src/Perspex.Styling/Styling/TypeNameAndClassSelector.cs +++ b/src/Perspex.Styling/Styling/TypeNameAndClassSelector.cs @@ -20,6 +20,7 @@ namespace Perspex.Styling private readonly Selector _previous; private Type _targetType; private Lazy> _classes = new Lazy>(() => new List()); + private string _selectorString; public static TypeNameAndClassSelector OfType(Selector previous, Type targetType) { @@ -81,47 +82,12 @@ namespace Perspex.Styling /// public override string ToString() { - var builder = new StringBuilder(); - - if (_previous != null) + if (_selectorString == null) { - builder.Append(_previous.ToString()); + _selectorString = BuildSelectorString(); } - if (TargetType != null) - { - if (IsConcreteType) - { - builder.Append(TargetType.Name); - } - else - { - builder.Append(":is("); - builder.Append(TargetType.Name); - builder.Append(")"); - } - } - - if (Name != null) - { - builder.Append('#'); - builder.Append(Name); - } - - if (_classes.IsValueCreated && _classes.Value.Count > 0) - { - foreach (var c in Classes) - { - if (!c.StartsWith(":")) - { - builder.Append('.'); - } - - builder.Append(c); - } - } - - return builder.ToString(); + return _selectorString; } /// @@ -193,5 +159,50 @@ namespace Perspex.Styling return remaining == 0; } + + private string BuildSelectorString() + { + var builder = new StringBuilder(); + + if (_previous != null) + { + builder.Append(_previous.ToString()); + } + + if (TargetType != null) + { + if (IsConcreteType) + { + builder.Append(TargetType.Name); + } + else + { + builder.Append(":is("); + builder.Append(TargetType.Name); + builder.Append(")"); + } + } + + if (Name != null) + { + builder.Append('#'); + builder.Append(Name); + } + + if (_classes.IsValueCreated && _classes.Value.Count > 0) + { + foreach (var c in Classes) + { + if (!c.StartsWith(":")) + { + builder.Append('.'); + } + + builder.Append(c); + } + } + + return builder.ToString(); + } } }