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();
+ }
}
}