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) while (e != null)
{ {
var root = e as IStyleRoot; if (e is IRenderRoot root)
if (root != null && root.StylingParent == null)
{ {
return root; return root as IStyleRoot;
} }
e = e.StylingParent; e = e.StylingParent;

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

@ -123,7 +123,26 @@ namespace Avalonia.Controls.UnitTests
} }
[Fact] [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 root = new TestRoot();
var parent = new Border(); var parent = new Border();
@ -148,6 +167,26 @@ namespace Avalonia.Controls.UnitTests
Assert.True(grandchildRaised); 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] [Fact]
public void Adding_Tree_To_IStyleRoot_Should_Style_Controls() 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;
using System.Linq; using System.Linq;
using Xunit; using Xunit;
using Avalonia.Rendering;
namespace Avalonia.Controls.UnitTests.Presenters namespace Avalonia.Controls.UnitTests.Presenters
{ {
@ -56,6 +57,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var parentMock = new Mock<Control>(); var parentMock = new Mock<Control>();
parentMock.As<IContentPresenterHost>(); parentMock.As<IContentPresenterHost>();
parentMock.As<IRenderRoot>();
parentMock.As<IStyleRoot>(); parentMock.As<IStyleRoot>();
(target as ISetLogicalParent).SetParent(parentMock.Object); (target as ISetLogicalParent).SetParent(parentMock.Object);
@ -100,6 +102,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
}; };
var parentMock = new Mock<Control>(); var parentMock = new Mock<Control>();
parentMock.As<IRenderRoot>();
parentMock.As<IStyleRoot>(); parentMock.As<IStyleRoot>();
parentMock.As<ILogical>().SetupGet(l => l.IsAttachedToLogicalTree).Returns(true); parentMock.As<ILogical>().SetupGet(l => l.IsAttachedToLogicalTree).Returns(true);
@ -144,6 +147,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var parentMock = new Mock<Control>(); var parentMock = new Mock<Control>();
parentMock.As<IContentPresenterHost>(); parentMock.As<IContentPresenterHost>();
parentMock.As<IRenderRoot>();
parentMock.As<IStyleRoot>(); parentMock.As<IStyleRoot>();
(target as ISetLogicalParent).SetParent(parentMock.Object); (target as ISetLogicalParent).SetParent(parentMock.Object);

Loading…
Cancel
Save