diff --git a/src/Avalonia.Controls/Button.cs b/src/Avalonia.Controls/Button.cs
index 9673eaadf7..12c778bf2e 100644
--- a/src/Avalonia.Controls/Button.cs
+++ b/src/Avalonia.Controls/Button.cs
@@ -678,7 +678,7 @@ namespace Avalonia.Controls
/// The event args.
private void RootDefaultKeyDown(object? sender, KeyEventArgs e)
{
- if (e.Key == Key.Enter && IsVisible && IsEnabled)
+ if (e.Key == Key.Enter && IsEffectivelyVisible && IsEffectivelyEnabled)
{
OnClick();
e.Handled = true;
@@ -692,7 +692,7 @@ namespace Avalonia.Controls
/// The event args.
private void RootCancelKeyDown(object? sender, KeyEventArgs e)
{
- if (e.Key == Key.Escape && IsVisible && IsEnabled)
+ if (e.Key == Key.Escape && IsEffectivelyVisible && IsEffectivelyEnabled)
{
OnClick();
e.Handled = true;
diff --git a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
index 9d4a90a812..e0c84fca0d 100644
--- a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs
@@ -455,6 +455,27 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(2, raised);
}
}
+
+ [Fact]
+ public void Button_IsDefault_Should_Not_Work_When_Button_Is_Not_Effectively_Visible()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var raised = 0;
+ var panel = new Panel();
+ var target = new Button();
+ panel.Children.Add(target);
+ var window = new Window { Content = panel };
+ window.Show();
+
+ target.Click += (s, e) => ++raised;
+
+ target.IsDefault = true;
+ panel.IsVisible = false;
+ window.RaiseEvent(CreateKeyDownEvent(Key.Enter));
+ Assert.Equal(0, raised);
+ }
+ }
[Fact]
public void Button_IsCancel_Works()
@@ -489,6 +510,27 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(2, raised);
}
}
+
+ [Fact]
+ public void Button_IsCancel_Should_Not_Work_When_Button_Is_Not_Effectively_Visible()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var raised = 0;
+ var panel = new Panel();
+ var target = new Button();
+ panel.Children.Add(target);
+ var window = new Window { Content = panel };
+ window.Show();
+
+ target.Click += (s, e) => ++raised;
+
+ target.IsCancel = true;
+ panel.IsVisible = false;
+ window.RaiseEvent(CreateKeyDownEvent(Key.Escape));
+ Assert.Equal(0, raised);
+ }
+ }
[Fact]
public void Button_CommandParameter_Does_Not_Change_While_Execution()