From 953ec9b3ef595336dfbd7ba397c8ef7305635218 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 28 Jul 2023 07:38:17 +0300 Subject: [PATCH] Remove BypassLogicalChildrenManagement and use OnPropertyChanged --- src/Avalonia.Controls/ContentControl.cs | 30 ++++++------------- .../TransitioningContentControl.cs | 8 ++--- .../TransitioningContentControlTests.cs | 9 ++++-- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/src/Avalonia.Controls/ContentControl.cs b/src/Avalonia.Controls/ContentControl.cs index 47f7598900..b278942f84 100644 --- a/src/Avalonia.Controls/ContentControl.cs +++ b/src/Avalonia.Controls/ContentControl.cs @@ -40,11 +40,6 @@ namespace Avalonia.Controls public static readonly StyledProperty VerticalContentAlignmentProperty = AvaloniaProperty.Register(nameof(VerticalContentAlignment)); - static ContentControl() - { - ContentProperty.Changed.AddClassHandler((x, e) => x.ContentChanged(e)); - } - /// /// Gets or sets the content to display. /// @@ -95,22 +90,20 @@ namespace Avalonia.Controls /// IAvaloniaList IContentPresenterHost.LogicalChildren => LogicalChildren; - /// - /// Determine whether manage his LogicalChildren - ///(default behavior) himself, or leaves the management to the inherited control. - /// - /// - /// The default value is false, So the manages itself, - /// if you want to bypass this behavior and manage LogicalChildren yourself, set - /// the to true. - /// - protected virtual bool BypassLogicalChildrenManagement => false; - /// bool IContentPresenterHost.RegisterContentPresenter(ContentPresenter presenter) { return RegisterContentPresenter(presenter); } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + if (change.Property == ContentProperty) + { + ContentChanged(change); + } + } /// /// Called when an is registered with the control. @@ -129,11 +122,6 @@ namespace Avalonia.Controls private void ContentChanged(AvaloniaPropertyChangedEventArgs e) { - if (BypassLogicalChildrenManagement) - { - return; - } - if (e.OldValue is ILogical oldChild) { LogicalChildren.Remove(oldChild); diff --git a/src/Avalonia.Controls/TransitioningContentControl.cs b/src/Avalonia.Controls/TransitioningContentControl.cs index c113afde17..0b04866d64 100644 --- a/src/Avalonia.Controls/TransitioningContentControl.cs +++ b/src/Avalonia.Controls/TransitioningContentControl.cs @@ -36,9 +36,6 @@ public class TransitioningContentControl : ContentControl set => SetValue(PageTransitionProperty, value); } - /// - protected override bool BypassLogicalChildrenManagement => true; - protected override Size ArrangeOverride(Size finalSize) { var result = base.ArrangeOverride(finalSize); @@ -101,12 +98,13 @@ public class TransitioningContentControl : ContentControl protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { - base.OnPropertyChanged(change); - if (change.Property == ContentProperty) { UpdateContent(true); + return; } + + base.OnPropertyChanged(change); } private void UpdateContent(bool withTransition) diff --git a/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs b/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs index 210b24b3ad..47e53676d8 100644 --- a/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs @@ -184,7 +184,7 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void Logical_Children_Dont_Duplicated() + public void Logical_Children_Should_Not_Be_Duplicated() { using var app = Start(); var (target, transition) = CreateTarget(""); @@ -194,18 +194,21 @@ namespace Avalonia.Controls.UnitTests target.Content = childControl; Assert.Equal(1, target.LogicalChildren.Count); + Assert.Equal(target.LogicalChildren[0], childControl); } [Fact] - public void First_Presenter_Register_TCC_As_Host() + public void First_Presenter_Should_Register_TCC_As_His_Host() { using var app = Start(); var (target, transition) = CreateTarget(""); + target.PageTransition = null; var childControl = new Control(); target.Presenter!.Content = childControl; - Assert.Contains(childControl, target.LogicalChildren); + Assert.Equal(1, target.LogicalChildren.Count); + Assert.Equal(target.LogicalChildren[0], childControl); } private static IDisposable Start()