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] @@ -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; } }