From 375e0f0a64e31f598c7c403bbcf83fac26854d0e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 19 Jan 2018 23:26:02 +0100 Subject: [PATCH 1/2] WIP --- src/Avalonia.Controls/Primitives/AdornerLayer.cs | 16 +++++++++++++++- src/Avalonia.Themes.Default/FocusAdorner.xaml | 2 +- .../Rendering/DeferredRenderer.cs | 9 +++++++++ .../VisualTree/TransformedBounds.cs | 6 +++--- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/AdornerLayer.cs b/src/Avalonia.Controls/Primitives/AdornerLayer.cs index d7862881fb..1a78493d8e 100644 --- a/src/Avalonia.Controls/Primitives/AdornerLayer.cs +++ b/src/Avalonia.Controls/Primitives/AdornerLayer.cs @@ -55,12 +55,13 @@ namespace Avalonia.Controls.Primitives foreach (var child in Children) { - var info = (AdornedElementInfo)child.GetValue(s_adornedElementInfoProperty); + var info = child.GetValue(s_adornedElementInfoProperty); if (info != null && info.Bounds.HasValue) { child.RenderTransform = new MatrixTransform(info.Bounds.Value.Transform); child.RenderTransformOrigin = new RelativePoint(new Point(0,0), RelativeUnit.Absolute); + UpdateClip(child, info.Bounds.Value); child.Arrange(info.Bounds.Value.Bounds); } else @@ -80,6 +81,19 @@ namespace Avalonia.Controls.Primitives layer?.UpdateAdornedElement(adorner, adorned); } + private void UpdateClip(IControl control, TransformedBounds bounds) + { + var clip = control.Clip as RectangleGeometry; + + if (clip == null) + { + clip = new RectangleGeometry { Transform = new MatrixTransform() }; + control.Clip = clip; + } + + clip.Rect = bounds.Clip.TransformToAABB(-bounds.Transform); + } + private void ChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { switch (e.Action) diff --git a/src/Avalonia.Themes.Default/FocusAdorner.xaml b/src/Avalonia.Themes.Default/FocusAdorner.xaml index 573c43dc8d..3037f5763b 100644 --- a/src/Avalonia.Themes.Default/FocusAdorner.xaml +++ b/src/Avalonia.Themes.Default/FocusAdorner.xaml @@ -1,7 +1,7 @@