From 0e7f4cac81e64c81acef315795371f7f91df3cab Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 25 Jul 2019 22:29:58 +0200 Subject: [PATCH] Ensure control is invalidated on ZIndex change. --- .../Rendering/DeferredRenderer.cs | 1 - src/Avalonia.Visuals/Visual.cs | 4 +- .../Avalonia.Visuals.UnitTests/VisualTests.cs | 47 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 536e0831ed..bf1799bbdc 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -561,7 +561,6 @@ namespace Avalonia.Rendering } } - System.Diagnostics.Debug.WriteLine("Invalidated " + rect); SceneInvalidated(this, new SceneInvalidatedEventArgs((IRenderRoot)_root, rect)); } } diff --git a/src/Avalonia.Visuals/Visual.cs b/src/Avalonia.Visuals/Visual.cs index 89d09ae58d..1f2d67b69e 100644 --- a/src/Avalonia.Visuals/Visual.cs +++ b/src/Avalonia.Visuals/Visual.cs @@ -514,7 +514,9 @@ namespace Avalonia /// The event args. private static void ZIndexChanged(AvaloniaPropertyChangedEventArgs e) { - var parent = (e.Sender as Visual)?._visualParent; + var sender = e.Sender as IVisual; + var parent = sender?.VisualParent; + sender?.InvalidateVisual(); parent?.VisualRoot?.Renderer?.RecalculateChildren(parent); } diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTests.cs b/tests/Avalonia.Visuals.UnitTests/VisualTests.cs index 504f0ada86..936a5d16a2 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTests.cs @@ -282,5 +282,52 @@ namespace Avalonia.Visuals.UnitTests Assert.True(called); } + + [Fact] + public void Changing_ZIndex_Should_InvalidateVisual() + { + Canvas canvas1; + var renderer = new Mock(); + var root = new TestRoot + { + Child = new StackPanel + { + Children = + { + (canvas1 = new Canvas()), + new Canvas(), + }, + }, + }; + + root.Renderer = renderer.Object; + canvas1.ZIndex = 10; + + renderer.Verify(x => x.AddDirty(canvas1)); + } + + [Fact] + public void Changing_ZIndex_Should_Recalculate_Parent_Children() + { + Canvas canvas1; + StackPanel stackPanel; + var renderer = new Mock(); + var root = new TestRoot + { + Child = stackPanel = new StackPanel + { + Children = + { + (canvas1 = new Canvas()), + new Canvas(), + }, + }, + }; + + root.Renderer = renderer.Object; + canvas1.ZIndex = 10; + + renderer.Verify(x => x.RecalculateChildren(stackPanel)); + } } }