Browse Source

Report correct root in logical tree attach/detach.

Fixes #1192.
pull/1205/head
Steven Kirk 9 years ago
parent
commit
815d3f719e
  1. 6
      src/Avalonia.Controls/Control.cs
  2. 41
      tests/Avalonia.Controls.UnitTests/ControlTests.cs
  3. 4
      tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs

6
src/Avalonia.Controls/Control.cs

@ -773,11 +773,9 @@ namespace Avalonia.Controls
{
while (e != null)
{
var root = e as IStyleRoot;
if (root != null && root.StylingParent == null)
if (e is IRenderRoot root)
{
return root;
return root as IStyleRoot;
}
e = e.StylingParent;

41
tests/Avalonia.Controls.UnitTests/ControlTests.cs

@ -123,7 +123,26 @@ namespace Avalonia.Controls.UnitTests
}
[Fact]
public void DetachedToLogicalParent_Should_Be_Called_When_Removed_From_Tree()
public void AttachedToLogicalParent_Should_Not_Be_Called_With_GlobalStyles_As_Root()
{
var globalStyles = Mock.Of<IGlobalStyles>();
var root = new TestRoot { StylingParent = globalStyles };
var child = new Border();
var raised = false;
child.AttachedToLogicalTree += (s, e) =>
{
Assert.Equal(root, e.Root);
raised = true;
};
root.Child = child;
Assert.True(raised);
}
[Fact]
public void DetachedFromLogicalParent_Should_Be_Called_When_Removed_From_Tree()
{
var root = new TestRoot();
var parent = new Border();
@ -148,6 +167,26 @@ namespace Avalonia.Controls.UnitTests
Assert.True(grandchildRaised);
}
[Fact]
public void DetachedFromLogicalParent_Should_Not_Be_Called_With_GlobalStyles_As_Root()
{
var globalStyles = Mock.Of<IGlobalStyles>();
var root = new TestRoot { StylingParent = globalStyles };
var child = new Border();
var raised = false;
child.DetachedFromLogicalTree += (s, e) =>
{
Assert.Equal(root, e.Root);
raised = true;
};
root.Child = child;
root.Child = null;
Assert.True(raised);
}
[Fact]
public void Adding_Tree_To_IStyleRoot_Should_Style_Controls()
{

4
tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs

@ -12,6 +12,7 @@ using Moq;
using System;
using System.Linq;
using Xunit;
using Avalonia.Rendering;
namespace Avalonia.Controls.UnitTests.Presenters
{
@ -56,6 +57,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var parentMock = new Mock<Control>();
parentMock.As<IContentPresenterHost>();
parentMock.As<IRenderRoot>();
parentMock.As<IStyleRoot>();
(target as ISetLogicalParent).SetParent(parentMock.Object);
@ -100,6 +102,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
};
var parentMock = new Mock<Control>();
parentMock.As<IRenderRoot>();
parentMock.As<IStyleRoot>();
parentMock.As<ILogical>().SetupGet(l => l.IsAttachedToLogicalTree).Returns(true);
@ -144,6 +147,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var parentMock = new Mock<Control>();
parentMock.As<IContentPresenterHost>();
parentMock.As<IRenderRoot>();
parentMock.As<IStyleRoot>();
(target as ISetLogicalParent).SetParent(parentMock.Object);

Loading…
Cancel
Save