From 88f2bd791d17ff67b6d369a4b19d9d836fb6856e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 16 May 2019 18:58:07 +0200 Subject: [PATCH] Fix hit testing in RectangleNode. There were two problems here: - As #2370 describes we were tested against the rotated AABB of the rectangle - We were hit-testing non-filled rectangles as filled rectangles Fixes #2370 --- .../Rendering/SceneGraph/RectangleNode.cs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs index 33cc39cbe3..c622dc8a43 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs @@ -105,8 +105,28 @@ namespace Avalonia.Rendering.SceneGraph } } - // TODO: This doesn't respect CornerRadius yet. /// - public override bool HitTest(Point p) => Bounds.Contains(p); + public override bool HitTest(Point p) + { + // TODO: This doesn't respect CornerRadius yet. + if (Transform.HasInverse) + { + p *= Transform.Invert(); + + if (Brush != null) + { + var rect = Rect.Inflate((Pen?.Thickness / 2) ?? 0); + return rect.Contains(p); + } + else + { + var borderRect = Rect.Inflate((Pen?.Thickness / 2) ?? 0); + var emptyRect = Rect.Deflate((Pen?.Thickness / 2) ?? 0); + return borderRect.Contains(p) && !emptyRect.Contains(p); + } + } + + return false; + } } }