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()