diff --git a/src/Avalonia.Controls/ContentControl.cs b/src/Avalonia.Controls/ContentControl.cs
index 0f53608bd3..42a14987e3 100644
--- a/src/Avalonia.Controls/ContentControl.cs
+++ b/src/Avalonia.Controls/ContentControl.cs
@@ -8,8 +8,6 @@ using Avalonia.Data;
using Avalonia.Layout;
using Avalonia.LogicalTree;
using Avalonia.Metadata;
-using Avalonia.Platform;
-using Avalonia.Styling;
namespace Avalonia.Controls
{
@@ -17,8 +15,11 @@ namespace Avalonia.Controls
/// Displays according to an .
///
[TemplatePart("PART_ContentPresenter", typeof(ContentPresenter))]
+ [PseudoClasses(pcEmpty)]
public class ContentControl : TemplatedControl, IContentControl, IContentPresenterHost
{
+ private const string pcEmpty = ":empty";
+
///
/// Defines the property.
///
@@ -61,6 +62,11 @@ namespace Avalonia.Controls
}.RegisterInNameScope(ns)));
}
+ public ContentControl()
+ {
+ UpdatePseudoClasses();
+ }
+
///
/// Gets or sets the content to display.
///
@@ -116,7 +122,7 @@ namespace Avalonia.Controls
{
return RegisterContentPresenter(presenter);
}
-
+
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
base.OnPropertyChanged(change);
@@ -153,6 +159,13 @@ namespace Avalonia.Controls
{
LogicalChildren.Add(newChild);
}
+
+ UpdatePseudoClasses();
+ }
+
+ private void UpdatePseudoClasses()
+ {
+ PseudoClasses.Set(pcEmpty, Content is null);
}
internal override void BuildDebugDisplay(StringBuilder builder, bool includeContent)
diff --git a/tests/Avalonia.Controls.UnitTests/ContentControlTests.cs b/tests/Avalonia.Controls.UnitTests/ContentControlTests.cs
index 87eb4ef2af..91a54e123c 100644
--- a/tests/Avalonia.Controls.UnitTests/ContentControlTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/ContentControlTests.cs
@@ -17,6 +17,20 @@ namespace Avalonia.Controls.UnitTests
{
public class ContentControlTests : ScopedTestBase
{
+ [Fact]
+ public void Empty_PseudoClass_Should_Track_Content()
+ {
+ var target = new ContentControl();
+
+ Assert.Contains(":empty", target.Classes);
+
+ target.Content = "Content";
+ Assert.DoesNotContain(":empty", target.Classes);
+
+ target.Content = null;
+ Assert.Contains(":empty", target.Classes);
+ }
+
[Fact]
public void Template_Should_Be_Instantiated()
{
diff --git a/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs b/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs
index ad0662311b..059ffdbca4 100644
--- a/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs
@@ -215,7 +215,7 @@ namespace Avalonia.Controls.UnitTests
window.ApplyTemplate();
window.Presenter!.ApplyTemplate();
- Assert.Empty(toolTip.Classes);
+ Assert.DoesNotContain(":open", toolTip.Classes);
}
}
@@ -240,7 +240,7 @@ namespace Avalonia.Controls.UnitTests
ToolTip.SetIsOpen(decorator, true);
- Assert.Equal(new[] { ":open" }, toolTip.Classes);
+ Assert.Contains(":open", toolTip.Classes);
VerifyToolTipType(decorator);
}
}
@@ -271,7 +271,7 @@ namespace Avalonia.Controls.UnitTests
AssertToolTipOpen(decorator);
ToolTip.SetIsOpen(decorator, false);
- Assert.Empty(toolTip.Classes);
+ Assert.DoesNotContain(":open", toolTip.Classes);
}
}
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
index 41c349d7e4..e6260f6eec 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
@@ -113,7 +113,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
Assert.Equal("Foo", ToolTip.GetTip(target));
}
-
+
[Fact]
public void NonExistent_Property_Throws()
{
@@ -279,7 +279,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
Assert.Equal(expected3, grid.RowDefinitions[2].Height);
Assert.Equal(expected4, grid.RowDefinitions[3].Height);
}
-
+
[Fact]
public void Grid_Row_Col_Definitions_Are_Parsed_Space_Delimiter()
{
@@ -905,7 +905,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
var xaml = "";
var target = (Button)AvaloniaRuntimeXamlLoader.Load(xaml);
- Assert.Equal(new[] { "foo", "bar" }, target.Classes);
+ Assert.Contains("foo", target.Classes);
+ Assert.Contains("bar", target.Classes);
}
[Fact]
@@ -921,7 +922,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
";
var target = (Button)AvaloniaRuntimeXamlLoader.Load(xaml);
- Assert.Equal(new[] { "foo", "bar" }, target.Classes);
+ Assert.Contains("foo", target.Classes);
+ Assert.Contains("bar", target.Classes);
}
[Fact]
@@ -970,16 +972,16 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
Child = child;
}
}
-
+
public class ObjectWithoutPublicCtor
{
public ObjectWithoutPublicCtor(string param)
{
Test1 = param;
}
-
+
public string? Test1 { get; set; }
-
+
public string? Test2 { get; set; }
}