diff --git a/src/Avalonia.Base/Rendering/IRenderer.cs b/src/Avalonia.Base/Rendering/IRenderer.cs index 56007c7e8c..bc69f90aa5 100644 --- a/src/Avalonia.Base/Rendering/IRenderer.cs +++ b/src/Avalonia.Base/Rendering/IRenderer.cs @@ -84,7 +84,7 @@ namespace Avalonia.Rendering /// ⚠️ This method is low-level and DOES NOT respect . /// Use to perform input hit testing, or provide your own function. /// - /// The point, in client coordinates. + /// The point, in coordinates relative to . /// The root of the subtree to search. /// /// A filter predicate. If the predicate returns false then the visual and all its diff --git a/src/Avalonia.Base/VisualTree/VisualExtensions.cs b/src/Avalonia.Base/VisualTree/VisualExtensions.cs index b97c15c4df..e7275cef61 100644 --- a/src/Avalonia.Base/VisualTree/VisualExtensions.cs +++ b/src/Avalonia.Base/VisualTree/VisualExtensions.cs @@ -334,21 +334,12 @@ namespace Avalonia.VisualTree ThrowHelper.ThrowIfNull(visual, nameof(visual)); var source = visual.GetPresentationSource(); - var root = source?.RootVisual; - - if (source is null || root is null) + if (source is null) { return null; } - var rootPoint = visual.TranslatePoint(p, (Visual)root); - - if (rootPoint.HasValue) - { - return source.HitTester.HitTestFirst(rootPoint.Value, visual, filter); - } - - return null; + return source.HitTester.HitTestFirst(p, visual, filter); } /// diff --git a/tests/Avalonia.Base.UnitTests/Input/InputExtensionsTests.cs b/tests/Avalonia.Base.UnitTests/Input/InputExtensionsTests.cs new file mode 100644 index 0000000000..61cf8b747b --- /dev/null +++ b/tests/Avalonia.Base.UnitTests/Input/InputExtensionsTests.cs @@ -0,0 +1,49 @@ +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Layout; +using Avalonia.Media; +using Avalonia.UnitTests; +using Xunit; + +namespace Avalonia.Base.UnitTests.Input; + +public class InputExtensionsTests +{ + [Fact] + public void InputHitTest_Should_Use_Coordinates_Relative_To_The_Subtree_Root() + { + Border target; + using var services = new CompositorTestServices(new Size(200, 200)) + { + TopLevel = + { + Content = new StackPanel + { + Background = Brushes.White, + Children = + { + new Border + { + Width = 100, + Height = 200, + Background = Brushes.Red, + }, + (target = new Border + { + Width = 100, + Height = 200, + Background = Brushes.Green, + }) + }, + Orientation = Orientation.Horizontal, + } + } + }; + + services.RunJobs(); + + var result = target.InputHitTest(new Point(50, 50), enabledElementsOnly: false); + + Assert.Same(target, result); + } +}