From 08d552de108c613d3f0bd745ff48ba80aa89a1aa Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Fri, 26 Oct 2018 16:11:38 +0300 Subject: [PATCH] fix button click for deferedrenderer --- src/Avalonia.Controls/Button.cs | 6 ++++-- tests/Avalonia.Controls.UnitTests/ButtonTests.cs | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/Button.cs b/src/Avalonia.Controls/Button.cs index dc65df2584..2d80af8e4a 100644 --- a/src/Avalonia.Controls/Button.cs +++ b/src/Avalonia.Controls/Button.cs @@ -7,6 +7,7 @@ using System.Windows.Input; using Avalonia.Data; using Avalonia.Input; using Avalonia.Interactivity; +using Avalonia.VisualTree; namespace Avalonia.Controls { @@ -252,9 +253,10 @@ namespace Avalonia.Controls IsPressed = false; e.Handled = true; - var hittest = VisualRoot?.Renderer?.HitTest(e.GetPosition(VisualRoot), VisualRoot, null); + var hittest = this.GetVisualsAt(e.GetPosition(this)); - if (ClickMode == ClickMode.Release && hittest?.Any(v => v == this) == true) + if (ClickMode == ClickMode.Release && + hittest.Any(c => c == this || (c as IStyledElement)?.TemplatedParent == this) == true) { OnClick(); } diff --git a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs index c318229700..76f2898700 100644 --- a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs @@ -106,7 +106,7 @@ namespace Avalonia.Controls.UnitTests Mock.Get(mouse).Setup(m => m.GetPosition(It.IsAny())).Returns(new Point(50, 50)); Mock.Get(mouse).Setup(m => m.Capture(It.IsAny())).Callback(v => captured = v); Mock.Get(mouse).Setup(m => m.Captured).Returns(() => captured); - Mock.Get(renderer).Setup(r => r.HitTest(It.IsAny(), It.IsAny(), null)) + Mock.Get(renderer).Setup(r => r.HitTest(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns>((p, r, f) => r.Bounds.Contains(p) ? new IVisual[] { r } : new IVisual[0]); @@ -142,7 +142,7 @@ namespace Avalonia.Controls.UnitTests Mock.Get(mouse).Setup(m => m.GetPosition(It.IsAny())).Returns(new Point(200, 50)); Mock.Get(mouse).Setup(m => m.Capture(It.IsAny())).Callback(v => captured = v); Mock.Get(mouse).Setup(m => m.Captured).Returns(() => captured); - Mock.Get(renderer).Setup(r => r.HitTest(It.IsAny(), It.IsAny(), null)) + Mock.Get(renderer).Setup(r => r.HitTest(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns>((p, r, f) => r.Bounds.Contains(p) ? new IVisual[] { r } : new IVisual[0]); @@ -179,7 +179,7 @@ namespace Avalonia.Controls.UnitTests Mock.Get(mouse).Setup(m => m.GetPosition(It.IsAny())).Returns(new Point(150, 50)); Mock.Get(mouse).Setup(m => m.Capture(It.IsAny())).Callback(v => captured = v); Mock.Get(mouse).Setup(m => m.Captured).Returns(() => captured); - Mock.Get(renderer).Setup(r => r.HitTest(It.IsAny(), It.IsAny(), null)) + Mock.Get(renderer).Setup(r => r.HitTest(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns>((p, r, f) => r.Bounds.Contains(p.Transform(r.RenderTransform.Value.Invert())) ? new IVisual[] { r } : new IVisual[0]); @@ -217,6 +217,11 @@ namespace Avalonia.Controls.UnitTests private class TestButton : Button, IRenderRoot { + public TestButton() + { + IsVisible = true; + } + public new Rect Bounds { get => base.Bounds;