diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index 52427c4ae6..88fbd290e6 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -20,6 +20,7 @@ namespace Avalonia.Rendering { private readonly IVisual _root; private readonly IRenderRoot _renderRoot; + private bool _updateTransformedBounds = true; private IRenderTarget _renderTarget; /// @@ -34,6 +35,13 @@ namespace Avalonia.Rendering _renderRoot = root as IRenderRoot; } + private ImmediateRenderer(IVisual root, bool updateTransformedBounds) + { + _root = root ?? throw new ArgumentNullException(nameof(root)); + _renderRoot = root as IRenderRoot; + _updateTransformedBounds = updateTransformedBounds; + } + /// public bool DrawFps { get; set; } @@ -98,7 +106,7 @@ namespace Avalonia.Rendering /// The render target. public static void Render(IVisual visual, IRenderTarget target) { - using (var renderer = new ImmediateRenderer(visual)) + using (var renderer = new ImmediateRenderer(visual, updateTransformedBounds: false)) using (var context = new DrawingContext(target.CreateDrawingContext(renderer))) { renderer.Render(context, visual, visual.Bounds); @@ -112,7 +120,7 @@ namespace Avalonia.Rendering /// The drawing context. public static void Render(IVisual visual, DrawingContext context) { - using (var renderer = new ImmediateRenderer(visual)) + using (var renderer = new ImmediateRenderer(visual, updateTransformedBounds: false)) { renderer.Render(context, visual, visual.Bounds); } @@ -193,6 +201,12 @@ namespace Avalonia.Rendering Render(new DrawingContext(context), visual, visual.Bounds); } + internal static void Render(IVisual visual, DrawingContext context, bool updateTransformedBounds) + { + using var renderer = new ImmediateRenderer(visual, updateTransformedBounds); + renderer.Render(context, visual, visual.Bounds); + } + private static void ClearTransformedBounds(IVisual visual) { foreach (var e in visual.GetSelfAndVisualDescendants()) @@ -308,7 +322,8 @@ namespace Avalonia.Rendering new TransformedBounds(bounds, new Rect(), context.CurrentContainerTransform); #pragma warning restore 0618 - visual.TransformedBounds = transformed; + if (_updateTransformedBounds) + visual.TransformedBounds = transformed; foreach (var child in visual.VisualChildren.OrderBy(x => x, ZIndexComparer.Instance)) { @@ -321,7 +336,7 @@ namespace Avalonia.Rendering : clipRect; Render(context, child, childClipRect); } - else + else if (_updateTransformedBounds) { ClearTransformedBounds(child); } @@ -329,7 +344,7 @@ namespace Avalonia.Rendering } } - if (!visual.IsVisible) + if (!visual.IsVisible && _updateTransformedBounds) { ClearTransformedBounds(visual); } diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs b/tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs index 8202735e5d..54d9ce40f0 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs @@ -40,7 +40,7 @@ namespace Avalonia.Visuals.UnitTests.VisualTree tree.Measure(Size.Infinity); tree.Arrange(new Rect(0, 0, 100, 100)); - ImmediateRenderer.Render(tree, context); + ImmediateRenderer.Render(tree, context, true); var track = control.GetObservable(Visual.TransformedBoundsProperty); var results = new List();