diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs index dd3388b30e..726d2c596c 100644 --- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs +++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs @@ -99,7 +99,7 @@ namespace Avalonia.Controls.Platform { root.Deactivated -= WindowDeactivated; } - + if (_root is TopLevel tl) tl.PlatformImpl.LostFocus -= TopLevelLostPlatformFocus; @@ -148,116 +148,116 @@ namespace Avalonia.Controls.Platform { case Key.Up: case Key.Down: + { + if (item?.IsTopLevel == true) { - if (item?.IsTopLevel == true) + if (item.HasSubMenu && !item.IsSubMenuOpen) { - if (item.HasSubMenu && !item.IsSubMenuOpen) - { - Open(item, true); - e.Handled = true; - } - } - else - { - goto default; + Open(item, true); + e.Handled = true; } - break; } + else + { + goto default; + } + break; + } case Key.Left: + { + if (item?.Parent is IMenuItem parent && !parent.IsTopLevel && parent.IsSubMenuOpen) { - if (item?.Parent is IMenuItem parent && !parent.IsTopLevel && parent.IsSubMenuOpen) - { - parent.Close(); - parent.Focus(); - e.Handled = true; - } - else - { - goto default; - } - break; + parent.Close(); + parent.Focus(); + e.Handled = true; + } + else + { + goto default; } + break; + } case Key.Right: + { + if (item != null && !item.IsTopLevel && item.HasSubMenu) { - if (item != null && !item.IsTopLevel && item.HasSubMenu) - { - Open(item, true); - e.Handled = true; - } - else - { - goto default; - } - break; + Open(item, true); + e.Handled = true; } - - case Key.Enter: + else { - if (item != null) - { - if (!item.HasSubMenu) - { - Click(item); - } - else - { - Open(item, true); - } - - e.Handled = true; - } - break; + goto default; } + break; + } - case Key.Escape: + case Key.Enter: + { + if (item != null) { - if (item?.Parent is IMenuElement parent) + if (!item.HasSubMenu) { - parent.Close(); - parent.Focus(); + Click(item); } else { - Menu!.Close(); + Open(item, true); } e.Handled = true; - break; } + break; + } - default: + case Key.Escape: + { + if (item?.Parent is IMenuElement parent) { - var direction = e.Key.ToNavigationDirection(); + parent.Close(); + parent.Focus(); + } + else + { + Menu!.Close(); + } - if (direction?.IsDirectional() == true) + e.Handled = true; + break; + } + + default: + { + var direction = e.Key.ToNavigationDirection(); + + if (direction?.IsDirectional() == true) + { + if (item == null && _isContextMenu) { - if (item == null && _isContextMenu) + if (Menu!.MoveSelection(direction.Value, true) == true) { - if (Menu!.MoveSelection(direction.Value, true) == true) - { - e.Handled = true; - } + e.Handled = true; } - else if (item?.Parent?.MoveSelection(direction.Value, true) == true) + } + else if (item?.Parent?.MoveSelection(direction.Value, true) == true) + { + // If the the parent is an IMenu which successfully moved its selection, + // and the current menu is open then close the current menu and open the + // new menu. + if (item.IsSubMenuOpen && + item.Parent is IMenu && + item.Parent.SelectedItem is object) { - // If the the parent is an IMenu which successfully moved its selection, - // and the current menu is open then close the current menu and open the - // new menu. - if (item.IsSubMenuOpen && - item.Parent is IMenu && - item.Parent.SelectedItem is object) - { - item.Close(); - Open(item.Parent.SelectedItem, true); - } - e.Handled = true; + item.Close(); + Open(item.Parent.SelectedItem, true); } + e.Handled = true; } - - break; } + + break; + } } if (!e.Handled && item?.Parent is IMenuItem parentItem) @@ -275,7 +275,7 @@ namespace Avalonia.Controls.Platform return; } - if (item.HasSubMenu && item.IsEnabled) + if (item.HasSubMenu) { Open(item, true); } @@ -441,7 +441,7 @@ namespace Avalonia.Controls.Platform { Menu?.Close(); } - + private void TopLevelLostPlatformFocus() { Menu?.Close();