From f7a584e86e0db552cd5509bd827361360ff8211c Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 13 Jul 2023 13:14:11 +0300 Subject: [PATCH] Return true when first presenter register and fix logical children duplicated --- src/Avalonia.Controls/ContentControl.cs | 16 ++++++++++++++++ .../TransitioningContentControl.cs | 11 +++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/ContentControl.cs b/src/Avalonia.Controls/ContentControl.cs index 867dca2be1..176157001e 100644 --- a/src/Avalonia.Controls/ContentControl.cs +++ b/src/Avalonia.Controls/ContentControl.cs @@ -95,6 +95,17 @@ 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 BypassLogicalChildrenManangment => false; + /// bool IContentPresenterHost.RegisterContentPresenter(ContentPresenter presenter) { @@ -118,6 +129,11 @@ namespace Avalonia.Controls private void ContentChanged(AvaloniaPropertyChangedEventArgs e) { + if (BypassLogicalChildrenManangment) + { + 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 bf540698f1..75f95d1d68 100644 --- a/src/Avalonia.Controls/TransitioningContentControl.cs +++ b/src/Avalonia.Controls/TransitioningContentControl.cs @@ -36,6 +36,9 @@ public class TransitioningContentControl : ContentControl set => SetValue(PageTransitionProperty, value); } + /// + protected override bool BypassLogicalChildrenManangment => true; + protected override Size ArrangeOverride(Size finalSize) { var result = base.ArrangeOverride(finalSize); @@ -79,8 +82,12 @@ public class TransitioningContentControl : ContentControl protected override bool RegisterContentPresenter(ContentPresenter presenter) { - if (!base.RegisterContentPresenter(presenter) && - presenter is ContentPresenter p && + if (base.RegisterContentPresenter(presenter)) + { + return true; + } + + if (presenter is ContentPresenter p && p.Name == "PART_ContentPresenter2") { _presenter2 = p;