diff --git a/src/Avalonia.Controls/Button.cs b/src/Avalonia.Controls/Button.cs index dc836a0871..614847ee4e 100644 --- a/src/Avalonia.Controls/Button.cs +++ b/src/Avalonia.Controls/Button.cs @@ -289,8 +289,9 @@ namespace Avalonia.Controls OnClick(); e.Handled = true; break; - case Key.Space: + // Avoid handling Space if the button isn't focused: a child TextBox might need it for text input + if (IsFocused) { if (ClickMode == ClickMode.Press) { @@ -299,22 +300,21 @@ namespace Avalonia.Controls IsPressed = true; e.Handled = true; - break; } - + break; case Key.Escape when Flyout != null: // If Flyout doesn't have focusable content, close the flyout here CloseFlyout(); break; } - base.OnKeyDown(e); } /// protected override void OnKeyUp(KeyEventArgs e) { - if (e.Key == Key.Space) + // Avoid handling Space if the button isn't focused: a child TextBox might need it for text input + if (e.Key == Key.Space && IsFocused) { if (ClickMode == ClickMode.Release) { diff --git a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs index 876adcc28f..e3b974491a 100644 --- a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs @@ -511,11 +511,39 @@ namespace Avalonia.Controls.UnitTests (target as IClickableControl).RaiseClick(); } + [Fact] + void Should_Not_Fire_Click_Event_On_Space_Key_When_It_Is_Not_Focus() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var raised = 0; + var target = new TextBox(); + var button = new Button() + { + Content = target, + }; + + var window = new Window { Content = button }; + window.Show(); + + button.Click += (s, e) => ++raised; + target.Focus(); + target.RaiseEvent(CreateKeyDownEvent(Key.Space)); + target.RaiseEvent(CreateKeyUpEvent(Key.Space)); + Assert.Equal(0, raised); + } + } + private KeyEventArgs CreateKeyDownEvent(Key key, Interactive source = null) { return new KeyEventArgs { RoutedEvent = InputElement.KeyDownEvent, Key = key, Source = source }; } + private KeyEventArgs CreateKeyUpEvent(Key key, Interactive source = null) + { + return new KeyEventArgs { RoutedEvent = InputElement.KeyUpEvent, Key = key, Source = source }; + } + private void RaisePointerPressed(Button button, int clickCount, MouseButton mouseButton, Point position) { _helper.Down(button, mouseButton, position, clickCount: clickCount);