From a2e936fbc4563a64f01476a775b753e8facf1ee4 Mon Sep 17 00:00:00 2001 From: laolarou Date: Sat, 18 Nov 2023 18:16:53 -0800 Subject: [PATCH] Fix for issue #13493 (#13518) * Update OpenGlControlBase.cs * Update TransitioningContentControl.cs * bug fix and add test --- .../TransitioningContentControl.cs | 8 +++++++ .../TransitioningContentControlTests.cs | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/Avalonia.Controls/TransitioningContentControl.cs b/src/Avalonia.Controls/TransitioningContentControl.cs index 0b04866d64..951cd209f0 100644 --- a/src/Avalonia.Controls/TransitioningContentControl.cs +++ b/src/Avalonia.Controls/TransitioningContentControl.cs @@ -15,6 +15,7 @@ namespace Avalonia.Controls; public class TransitioningContentControl : ContentControl { private CancellationTokenSource? _currentTransition; + private ContentPresenter? _lastPresenter; private ContentPresenter? _presenter2; private bool _isFirstFull; private bool _shouldAnimate; @@ -115,8 +116,15 @@ public class TransitioningContentControl : ContentControl } var currentPresenter = _isFirstFull ? _presenter2 : Presenter; + + if (_lastPresenter != null && + _lastPresenter != currentPresenter && + _lastPresenter.Content == Content) + _lastPresenter.Content = null; + currentPresenter.Content = Content; currentPresenter.IsVisible = true; + _lastPresenter = currentPresenter; _isFirstFull = !_isFirstFull; diff --git a/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs b/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs index 47e53676d8..5ca9b54731 100644 --- a/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs @@ -211,6 +211,28 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(target.LogicalChildren[0], childControl); } + [Fact] + public void Old_Content_Should_Be_Null_When_New_Content_Is_Old_one() + { + using var app = Start(); + var (target, transition) = CreateTarget(""); + var presenter2 = GetContentPresenters2(target); + target.PageTransition = null; + + var childControl = new Control(); + target.Presenter!.Content = childControl; + + const string fakePage1 = "fakePage1"; + const string fakePage2 = "fakePage2"; + + target.Presenter!.Content = fakePage1; + target.Presenter!.Content = fakePage2; + target.Presenter!.Content = fakePage1; + + Assert.Equal(fakePage1, target.Presenter!.Content); + Assert.Equal(null, presenter2.Content); + } + private static IDisposable Start() { return UnitTestApplication.Start(