Browse Source

Merge pull request #12173 from danielmayost/tcc-fixes

[TransitioningContentControl] Manage his LogicalChildren
pull/12563/head
Julien Lebosquain 3 years ago
committed by GitHub
parent
commit
7a66ea7496
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      src/Avalonia.Controls/ContentControl.cs
  2. 13
      src/Avalonia.Controls/TransitioningContentControl.cs
  3. 28
      tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs

15
src/Avalonia.Controls/ContentControl.cs

@ -40,11 +40,6 @@ namespace Avalonia.Controls
public static readonly StyledProperty<VerticalAlignment> VerticalContentAlignmentProperty = public static readonly StyledProperty<VerticalAlignment> VerticalContentAlignmentProperty =
AvaloniaProperty.Register<ContentControl, VerticalAlignment>(nameof(VerticalContentAlignment)); AvaloniaProperty.Register<ContentControl, VerticalAlignment>(nameof(VerticalContentAlignment));
static ContentControl()
{
ContentProperty.Changed.AddClassHandler<ContentControl>((x, e) => x.ContentChanged(e));
}
/// <summary> /// <summary>
/// Gets or sets the content to display. /// Gets or sets the content to display.
/// </summary> /// </summary>
@ -100,6 +95,16 @@ namespace Avalonia.Controls
{ {
return RegisterContentPresenter(presenter); return RegisterContentPresenter(presenter);
} }
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
base.OnPropertyChanged(change);
if (change.Property == ContentProperty)
{
ContentChanged(change);
}
}
/// <summary> /// <summary>
/// Called when an <see cref="ContentPresenter"/> is registered with the control. /// Called when an <see cref="ContentPresenter"/> is registered with the control.

13
src/Avalonia.Controls/TransitioningContentControl.cs

@ -79,8 +79,12 @@ public class TransitioningContentControl : ContentControl
protected override bool RegisterContentPresenter(ContentPresenter presenter) protected override bool RegisterContentPresenter(ContentPresenter presenter)
{ {
if (!base.RegisterContentPresenter(presenter) && if (base.RegisterContentPresenter(presenter))
presenter is ContentPresenter p && {
return true;
}
if (presenter is ContentPresenter p &&
p.Name == "PART_ContentPresenter2") p.Name == "PART_ContentPresenter2")
{ {
_presenter2 = p; _presenter2 = p;
@ -94,12 +98,13 @@ public class TransitioningContentControl : ContentControl
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{ {
base.OnPropertyChanged(change);
if (change.Property == ContentProperty) if (change.Property == ContentProperty)
{ {
UpdateContent(true); UpdateContent(true);
return;
} }
base.OnPropertyChanged(change);
} }
private void UpdateContent(bool withTransition) private void UpdateContent(bool withTransition)

28
tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs

@ -183,6 +183,34 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal("bar", presenter2.Content); Assert.Equal("bar", presenter2.Content);
} }
[Fact]
public void Logical_Children_Should_Not_Be_Duplicated()
{
using var app = Start();
var (target, transition) = CreateTarget("");
target.PageTransition = null;
var childControl = new Control();
target.Content = childControl;
Assert.Equal(1, target.LogicalChildren.Count);
Assert.Equal(target.LogicalChildren[0], childControl);
}
[Fact]
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.Equal(1, target.LogicalChildren.Count);
Assert.Equal(target.LogicalChildren[0], childControl);
}
private static IDisposable Start() private static IDisposable Start()
{ {
return UnitTestApplication.Start( return UnitTestApplication.Start(

Loading…
Cancel
Save