diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual.cs
index 0b2df6d2b3..e33dc999dc 100644
--- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual.cs
+++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual.cs
@@ -175,8 +175,14 @@ namespace Avalonia.Rendering.Composition.Server
EffectiveOpacity = Opacity * (Parent?.EffectiveOpacity ?? 1);
- IsVisibleInFrame = _parent?.IsVisibleInFrame != false && Visible && EffectiveOpacity > 0.04 && !_isBackface &&
- !_combinedTransformedClipBounds.IsDefault;
+ IsHitTestVisibleInFrame = _parent?.IsHitTestVisibleInFrame != false
+ && Visible
+ && !_isBackface
+ && !_combinedTransformedClipBounds.IsDefault;
+
+ IsVisibleInFrame = IsHitTestVisibleInFrame
+ && _parent?.IsVisibleInFrame != false
+ && EffectiveOpacity > 0.04;
if (wasVisible != IsVisibleInFrame || positionChanged)
{
@@ -200,7 +206,7 @@ namespace Avalonia.Rendering.Composition.Server
readback.Revision = root.Revision;
readback.Matrix = GlobalTransformMatrix;
readback.TargetId = Root.Id;
- readback.Visible = IsVisibleInFrame;
+ readback.Visible = IsHitTestVisibleInFrame;
}
void AddDirtyRect(Rect rc)
@@ -261,6 +267,7 @@ namespace Avalonia.Rendering.Composition.Server
}
public bool IsVisibleInFrame { get; set; }
+ public bool IsHitTestVisibleInFrame { get; set; }
public double EffectiveOpacity { get; set; }
public Rect TransformedOwnContentBounds { get; set; }
public virtual Rect OwnContentBounds => new Rect(0, 0, Size.X, Size.Y);
diff --git a/src/Avalonia.X11/Avalonia.X11.csproj b/src/Avalonia.X11/Avalonia.X11.csproj
index c762349c1c..061c516ef6 100644
--- a/src/Avalonia.X11/Avalonia.X11.csproj
+++ b/src/Avalonia.X11/Avalonia.X11.csproj
@@ -10,7 +10,12 @@
-
-
-
+
+
+
+
+
+
+
+
diff --git a/tests/Avalonia.Base.UnitTests/Rendering/CompositorHitTestingTests.cs b/tests/Avalonia.Base.UnitTests/Rendering/CompositorHitTestingTests.cs
index 27faf1e13c..3d8369faeb 100644
--- a/tests/Avalonia.Base.UnitTests/Rendering/CompositorHitTestingTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Rendering/CompositorHitTestingTests.cs
@@ -82,6 +82,39 @@ public class CompositorHitTestingTests : CompositorTestsBase
}
}
+ [Theory,
+ InlineData(false, false),
+ InlineData(true, false),
+ InlineData(false, true),
+ InlineData(true, true),
+ ]
+ public void HitTest_Should_Find_Zero_Opacity_Controls_At_Point(bool parent, bool child)
+ {
+
+ using (var s = new CompositorServices(new Size(200, 200)))
+ {
+ Border visible, border;
+ s.TopLevel.Content = border = new Border
+ {
+ Width = 100,
+ Height = 100,
+ Background = Brushes.Red,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ Opacity = parent ? 0 : 1,
+ Child = visible = new Border
+ {
+ Opacity = child ? 0 : 1,
+ Background = Brushes.Red,
+ HorizontalAlignment = HorizontalAlignment.Stretch,
+ VerticalAlignment = VerticalAlignment.Stretch,
+ }
+ };
+
+ s.AssertHitTest(new Point(100, 100), null, visible, border);
+ }
+ }
+
[Fact]
public void HitTest_Should_Not_Find_Control_Outside_Point()
{