Explorar el Código

Fix for issue #13493 (#13518)

* Update OpenGlControlBase.cs

* Update TransitioningContentControl.cs

* bug fix and add test
laolarou hace 2 años
padre
commit
c6c12cee37

+ 8 - 0
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;
@@ -133,8 +134,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;
 

+ 22 - 0
tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs

@@ -242,6 +242,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(