From dfe0130a1bfa4d9967f376ff0bdbe78a98240a7e Mon Sep 17 00:00:00 2001 From: Boyd Patterson Date: Fri, 13 Oct 2023 09:39:17 -0500 Subject: [PATCH] Do not match access keys on input elements that are not effectively enabled. (#13185) --- src/Avalonia.Base/Input/AccessKeyHandler.cs | 3 ++- .../Input/AccessKeyHandlerTests.cs | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Input/AccessKeyHandler.cs b/src/Avalonia.Base/Input/AccessKeyHandler.cs index 38692d8b77d..fe5e2c46a21 100644 --- a/src/Avalonia.Base/Input/AccessKeyHandler.cs +++ b/src/Avalonia.Base/Input/AccessKeyHandler.cs @@ -183,7 +183,8 @@ protected virtual void OnKeyDown(object? sender, KeyEventArgs e) var text = e.Key.ToString(); var matches = _registered .Where(x => string.Equals(x.AccessKey, text, StringComparison.OrdinalIgnoreCase) - && x.Element.IsEffectivelyVisible) + && x.Element.IsEffectivelyVisible + && x.Element.IsEffectivelyEnabled) .Select(x => x.Element); // If the menu is open, only match controls in the menu's visual tree. diff --git a/tests/Avalonia.Base.UnitTests/Input/AccessKeyHandlerTests.cs b/tests/Avalonia.Base.UnitTests/Input/AccessKeyHandlerTests.cs index 4d8ece4ddaa..ed1061e85a9 100644 --- a/tests/Avalonia.Base.UnitTests/Input/AccessKeyHandlerTests.cs +++ b/tests/Avalonia.Base.UnitTests/Input/AccessKeyHandlerTests.cs @@ -165,6 +165,30 @@ public void Should_Raise_AccessKeyPressed_For_Registered_Access_Key() Assert.Equal(1, raised); } + [Fact] + public void Should_Not_Raise_AccessKeyPressed_For_Registered_Access_Key_When_Not_Effectively_Enabled() + { + var button = new Button(); + var root = new TestRoot(button) { IsEnabled = false }; + var target = new AccessKeyHandler(); + var raised = 0; + + target.SetOwner(root); + target.Register('A', button); + button.AddHandler(AccessKeyHandler.AccessKeyPressedEvent, (s, e) => ++raised); + + KeyDown(root, Key.LeftAlt); + Assert.Equal(0, raised); + + KeyDown(root, Key.A, KeyModifiers.Alt); + Assert.Equal(0, raised); + + KeyUp(root, Key.A, KeyModifiers.Alt); + KeyUp(root, Key.LeftAlt); + + Assert.Equal(0, raised); + } + [Fact] public void Should_Open_MainMenu_On_Alt_KeyUp() {