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);
+ }
+}