From 066a59b250046de708a4ab082123f2cc4dce31b4 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Fri, 11 Oct 2024 10:14:55 +0100 Subject: [PATCH] Fix cropping overlay --- .../ContentCropper/ContentCropper.axaml | 17 +------ .../ContentCropper/ContentCropper.cs | 50 +++++++------------ 2 files changed, 19 insertions(+), 48 deletions(-) diff --git a/Toolkit.UI.Controls.Avalonia/ContentCropper/ContentCropper.axaml b/Toolkit.UI.Controls.Avalonia/ContentCropper/ContentCropper.axaml index 6e3c494..9794b98 100644 --- a/Toolkit.UI.Controls.Avalonia/ContentCropper/ContentCropper.axaml +++ b/Toolkit.UI.Controls.Avalonia/ContentCropper/ContentCropper.axaml @@ -56,22 +56,7 @@ ContentTemplate="{TemplateBinding ContentTemplate}" /> - - - - + GetValue(ScaleSizeProperty); set => SetValue(ScaleSizeProperty, value); } - protected override void OnApplyTemplate(TemplateAppliedEventArgs args) { base.OnApplyTemplate(args); canvas = args.NameScope.Find("Canvas"); - rectangleLeft = args.NameScope.Find("RectangleLeft"); - rectangleTop = args.NameScope.Find("RectangleTop"); - rectangleRight = args.NameScope.Find("RectangleRight"); - rectangleBottom = args.NameScope.Find("RectangleBottom"); + overlayPath = args.NameScope.Find("OverlayPath"); border = args.NameScope.Find("Border"); topLeftButton = args.NameScope.Find("TopLeftButton"); @@ -338,38 +332,30 @@ public class ContentCropper : ContentControl private void RenderOverLays() { - if (canvas == null || - border == null || - rectangleLeft == null || - rectangleTop == null || - rectangleRight == null || - rectangleBottom == null) + if (canvas == null || border == null || overlayPath == null) { return; } double borderTop = Canvas.GetTop(border); double borderLeft = Canvas.GetLeft(border); + double borderWidth = border.Width; + double borderHeight = border.Height; - rectangleLeft.Width = Math.Max(0, borderLeft); - rectangleLeft.Height = Math.Max(0, border.Height); - Canvas.SetTop(rectangleLeft, borderTop); + RectangleGeometry outerRect = new(new Rect(0, 0, + canvas.Width, + canvas.Height)); - rectangleTop.Width = Math.Max(0, canvas.Width); - rectangleTop.Height = Math.Max(0, borderTop - 0.5); + RectangleGeometry innerRect = new(new Rect(borderLeft, + borderTop, + borderWidth, + borderHeight)); - double rightX = borderLeft + border.Width; + CombinedGeometry punchThroughGeometry = new(GeometryCombineMode.Exclude, + outerRect, + innerRect); - rectangleRight.Width = Math.Max(0, canvas.Width - rightX); - rectangleRight.Height = Math.Max(0, border.Height); - Canvas.SetLeft(rectangleRight, rightX); - Canvas.SetTop(rectangleRight, borderTop); - - double bottomY = borderTop + border.Height; - - rectangleBottom.Width = Math.Max(0, canvas.Width); - rectangleBottom.Height = Math.Max(0, canvas.Height - bottomY); - Canvas.SetTop(rectangleBottom, bottomY); + overlayPath.Data = punchThroughGeometry; } private void UpdateCropArea(double width, double height)