diff --git a/src/Avalonia.Base/Styling/ChildSelector.cs b/src/Avalonia.Base/Styling/ChildSelector.cs
index 9512dc34df..a6093bf026 100644
--- a/src/Avalonia.Base/Styling/ChildSelector.cs
+++ b/src/Avalonia.Base/Styling/ChildSelector.cs
@@ -27,11 +27,11 @@ namespace Avalonia.Styling
///
public override Type? TargetType => null;
- public override string ToString()
+ public override string ToString(Style? owner)
{
if (_selectorString == null)
{
- _selectorString = _parent.ToString() + " > ";
+ _selectorString = _parent.ToString(owner) + " > ";
}
return _selectorString;
diff --git a/src/Avalonia.Base/Styling/ControlTheme.cs b/src/Avalonia.Base/Styling/ControlTheme.cs
index 8fd94297b6..46a3267f70 100644
--- a/src/Avalonia.Base/Styling/ControlTheme.cs
+++ b/src/Avalonia.Base/Styling/ControlTheme.cs
@@ -52,13 +52,7 @@ namespace Avalonia.Styling
return result;
}
- public override string ToString()
- {
- if (TargetType is not null)
- return "ControlTheme: " + TargetType.Name;
- else
- return "ControlTheme";
- }
+ public override string ToString() => TargetType?.Name ?? "ControlTheme";
internal override void SetParent(StyleBase? parent)
{
diff --git a/src/Avalonia.Base/Styling/DescendentSelector.cs b/src/Avalonia.Base/Styling/DescendentSelector.cs
index 677a924189..728dd08301 100644
--- a/src/Avalonia.Base/Styling/DescendentSelector.cs
+++ b/src/Avalonia.Base/Styling/DescendentSelector.cs
@@ -25,11 +25,11 @@ namespace Avalonia.Styling
///
public override Type? TargetType => null;
- public override string ToString()
+ public override string ToString(Style? owner)
{
if (_selectorString == null)
{
- _selectorString = _parent.ToString() + ' ';
+ _selectorString = _parent.ToString(owner) + ' ';
}
return _selectorString;
diff --git a/src/Avalonia.Base/Styling/NestingSelector.cs b/src/Avalonia.Base/Styling/NestingSelector.cs
index 77c5b719c6..dd627a7db9 100644
--- a/src/Avalonia.Base/Styling/NestingSelector.cs
+++ b/src/Avalonia.Base/Styling/NestingSelector.cs
@@ -11,7 +11,7 @@ namespace Avalonia.Styling
public override bool IsCombinator => false;
public override Type? TargetType => null;
- public override string ToString() => "^";
+ public override string ToString(Style? owner) => owner?.Parent?.ToString() ?? "^";
protected override SelectorMatch Evaluate(IStyleable control, IStyle? parent, bool subscribe)
{
diff --git a/src/Avalonia.Base/Styling/NotSelector.cs b/src/Avalonia.Base/Styling/NotSelector.cs
index c7727bb6b8..4491762b8f 100644
--- a/src/Avalonia.Base/Styling/NotSelector.cs
+++ b/src/Avalonia.Base/Styling/NotSelector.cs
@@ -35,11 +35,11 @@ namespace Avalonia.Styling
public override Type? TargetType => _previous?.TargetType;
///
- public override string ToString()
+ public override string ToString(Style? owner)
{
if (_selectorString == null)
{
- _selectorString = $"{_previous?.ToString()}:not({_argument})";
+ _selectorString = $"{_previous?.ToString(owner)}:not({_argument})";
}
return _selectorString;
diff --git a/src/Avalonia.Base/Styling/NthChildSelector.cs b/src/Avalonia.Base/Styling/NthChildSelector.cs
index f473791664..f772f58c42 100644
--- a/src/Avalonia.Base/Styling/NthChildSelector.cs
+++ b/src/Avalonia.Base/Styling/NthChildSelector.cs
@@ -107,10 +107,10 @@ namespace Avalonia.Styling
protected override Selector? MovePrevious() => _previous;
protected override Selector? MovePreviousOrParent() => _previous;
- public override string ToString()
+ public override string ToString(Style? owner)
{
var expectedCapacity = NthLastChildSelectorName.Length + 8;
- var stringBuilder = new StringBuilder(_previous?.ToString(), expectedCapacity);
+ var stringBuilder = new StringBuilder(_previous?.ToString(owner), expectedCapacity);
stringBuilder.Append(':');
stringBuilder.Append(_reversed ? NthLastChildSelectorName : NthChildSelectorName);
diff --git a/src/Avalonia.Base/Styling/OrSelector.cs b/src/Avalonia.Base/Styling/OrSelector.cs
index af9249864f..0c48b76ded 100644
--- a/src/Avalonia.Base/Styling/OrSelector.cs
+++ b/src/Avalonia.Base/Styling/OrSelector.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using Avalonia.Styling.Activators;
#nullable enable
@@ -55,11 +56,11 @@ namespace Avalonia.Styling
}
///
- public override string ToString()
+ public override string ToString(Style? owner)
{
if (_selectorString == null)
{
- _selectorString = string.Join(", ", _selectors);
+ _selectorString = string.Join(", ", _selectors.Select(x => x.ToString(owner)));
}
return _selectorString;
diff --git a/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs b/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs
index 48136ba2de..3e50ee5522 100644
--- a/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs
+++ b/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs
@@ -38,7 +38,7 @@ namespace Avalonia.Styling
public override Type? TargetType => _previous?.TargetType;
///
- public override string ToString()
+ public override string ToString(Style? owner)
{
if (_selectorString == null)
{
@@ -46,7 +46,7 @@ namespace Avalonia.Styling
if (_previous != null)
{
- builder.Append(_previous.ToString());
+ builder.Append(_previous.ToString(owner));
}
builder.Append('[');
diff --git a/src/Avalonia.Base/Styling/Selector.cs b/src/Avalonia.Base/Styling/Selector.cs
index 7ce17518dd..7f5ee48351 100644
--- a/src/Avalonia.Base/Styling/Selector.cs
+++ b/src/Avalonia.Base/Styling/Selector.cs
@@ -67,6 +67,15 @@ namespace Avalonia.Styling
return match;
}
+ public override string ToString() => ToString(null);
+
+ ///
+ /// Gets a string representing the selector, with the nesting separator (`^`) replaced with
+ /// the parent selector.
+ ///
+ /// The owner style.
+ public abstract string ToString(Style? owner);
+
///
/// Evaluates the selector for a match.
///
diff --git a/src/Avalonia.Base/Styling/Style.cs b/src/Avalonia.Base/Styling/Style.cs
index 9f8b290132..913c437bc4 100644
--- a/src/Avalonia.Base/Styling/Style.cs
+++ b/src/Avalonia.Base/Styling/Style.cs
@@ -68,17 +68,7 @@ namespace Avalonia.Styling
/// Returns a string representation of the style.
///
/// A string representation of the style.
- public override string ToString()
- {
- if (Selector != null)
- {
- return "Style: " + Selector.ToString();
- }
- else
- {
- return "Style";
- }
- }
+ public override string ToString() => Selector?.ToString(this) ?? "Style";
internal override void SetParent(StyleBase? parent)
{
diff --git a/src/Avalonia.Base/Styling/TemplateSelector.cs b/src/Avalonia.Base/Styling/TemplateSelector.cs
index 278e24a203..82d934ee34 100644
--- a/src/Avalonia.Base/Styling/TemplateSelector.cs
+++ b/src/Avalonia.Base/Styling/TemplateSelector.cs
@@ -26,11 +26,11 @@ namespace Avalonia.Styling
///
public override Type? TargetType => null;
- public override string ToString()
+ public override string ToString(Style? owner)
{
if (_selectorString == null)
{
- _selectorString = _parent.ToString() + " /template/ ";
+ _selectorString = _parent.ToString(owner) + " /template/ ";
}
return _selectorString;
diff --git a/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs b/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs
index 94a6db41f6..8e45e1770e 100644
--- a/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs
+++ b/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs
@@ -84,11 +84,11 @@ namespace Avalonia.Styling
public IList Classes => _classes.Value;
///
- public override string ToString()
+ public override string ToString(Style? owner)
{
if (_selectorString == null)
{
- _selectorString = BuildSelectorString();
+ _selectorString = BuildSelectorString(owner);
}
return _selectorString;
@@ -143,13 +143,13 @@ namespace Avalonia.Styling
protected override Selector? MovePrevious() => _previous;
protected override Selector? MovePreviousOrParent() => _previous;
- private string BuildSelectorString()
+ private string BuildSelectorString(Style? owner)
{
var builder = new StringBuilder();
if (_previous != null)
{
- builder.Append(_previous.ToString());
+ builder.Append(_previous.ToString(owner));
}
if (TargetType != null)