From 0621e9fb3b9d65bf75de6c6f9df38f77838cac2c Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 9 Apr 2022 20:00:11 +0200 Subject: [PATCH] Hackfix for menu access keys. Added a very hacky fix for #7777: if we key a keydown in an open `MenuItem` then manually pass the access key to the popup's `MenuItemAccessKeyHandler`, shortcutting the standard access key handling. Fixes #7777 --- src/Avalonia.Controls/MenuItem.cs | 9 ++++++++- src/Avalonia.Controls/MenuItemAccessKeyHandler.cs | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/MenuItem.cs b/src/Avalonia.Controls/MenuItem.cs index 955af8888b..ed3526cc68 100644 --- a/src/Avalonia.Controls/MenuItem.cs +++ b/src/Avalonia.Controls/MenuItem.cs @@ -433,7 +433,14 @@ namespace Avalonia.Controls /// protected override void OnKeyDown(KeyEventArgs e) { - // Don't handle here: let event bubble up to menu. + // HACK: Fix for #7777 - Menu keyboard focus incorrect when handling menu mnemonics. + // If we implement something like UWP's access key scopes then this code should be removed. + if (IsSubMenuOpen && + _popup?.Host is IInputRoot popupRoot && + popupRoot.AccessKeyHandler is MenuItemAccessKeyHandler handler) + { + handler.OnTextInput(this, new TextInputEventArgs { Text = e.Key.ToString() }); + } } /// diff --git a/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs b/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs index 4cc6a20082..964daa23fe 100644 --- a/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs +++ b/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs @@ -84,7 +84,7 @@ namespace Avalonia.Controls /// /// The event sender. /// The event args. - protected virtual void OnTextInput(object? sender, TextInputEventArgs e) + protected internal virtual void OnTextInput(object? sender, TextInputEventArgs e) { if (!string.IsNullOrWhiteSpace(e.Text)) {