|
|
|
@ -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.HasSubMenu && !item.IsSubMenuOpen) |
|
|
|
if (item?.IsTopLevel == true) |
|
|
|
{ |
|
|
|
Open(item, true); |
|
|
|
e.Handled = true; |
|
|
|
if (item.HasSubMenu && !item.IsSubMenuOpen) |
|
|
|
{ |
|
|
|
Open(item, true); |
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
goto default; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
goto default; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case Key.Left: |
|
|
|
{ |
|
|
|
if (item?.Parent is IMenuItem parent && !parent.IsTopLevel && parent.IsSubMenuOpen) |
|
|
|
{ |
|
|
|
parent.Close(); |
|
|
|
parent.Focus(); |
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
goto default; |
|
|
|
if (item?.Parent is IMenuItem parent && !parent.IsTopLevel && parent.IsSubMenuOpen) |
|
|
|
{ |
|
|
|
parent.Close(); |
|
|
|
parent.Focus(); |
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
goto default; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case Key.Right: |
|
|
|
{ |
|
|
|
if (item != null && !item.IsTopLevel && item.HasSubMenu) |
|
|
|
{ |
|
|
|
Open(item, true); |
|
|
|
e.Handled = true; |
|
|
|
if (item != null && !item.IsTopLevel && item.HasSubMenu) |
|
|
|
{ |
|
|
|
Open(item, true); |
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
goto default; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
else |
|
|
|
|
|
|
|
case Key.Enter: |
|
|
|
{ |
|
|
|
goto default; |
|
|
|
if (item != null) |
|
|
|
{ |
|
|
|
if (!item.HasSubMenu) |
|
|
|
{ |
|
|
|
Click(item); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
Open(item, true); |
|
|
|
} |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case Key.Enter: |
|
|
|
{ |
|
|
|
if (item != null) |
|
|
|
case Key.Escape: |
|
|
|
{ |
|
|
|
if (!item.HasSubMenu) |
|
|
|
if (item?.Parent is IMenuElement parent) |
|
|
|
{ |
|
|
|
Click(item); |
|
|
|
parent.Close(); |
|
|
|
parent.Focus(); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
Open(item, true); |
|
|
|
Menu!.Close(); |
|
|
|
} |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case Key.Escape: |
|
|
|
{ |
|
|
|
if (item?.Parent is IMenuElement parent) |
|
|
|
{ |
|
|
|
parent.Close(); |
|
|
|
parent.Focus(); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
Menu!.Close(); |
|
|
|
} |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
default: |
|
|
|
{ |
|
|
|
var direction = e.Key.ToNavigationDirection(); |
|
|
|
|
|
|
|
if (direction?.IsDirectional() == true) |
|
|
|
{ |
|
|
|
if (item == null && _isContextMenu) |
|
|
|
var direction = e.Key.ToNavigationDirection(); |
|
|
|
|
|
|
|
if (direction?.IsDirectional() == true) |
|
|
|
{ |
|
|
|
if (Menu!.MoveSelection(direction.Value, true) == true) |
|
|
|
if (item == null && _isContextMenu) |
|
|
|
{ |
|
|
|
e.Handled = true; |
|
|
|
if (Menu!.MoveSelection(direction.Value, true) == true) |
|
|
|
{ |
|
|
|
e.Handled = 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) |
|
|
|
else if (item?.Parent?.MoveSelection(direction.Value, true) == true) |
|
|
|
{ |
|
|
|
item.Close(); |
|
|
|
Open(item.Parent.SelectedItem, 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) |
|
|
|
{ |
|
|
|
item.Close(); |
|
|
|
Open(item.Parent.SelectedItem, true); |
|
|
|
} |
|
|
|
e.Handled = 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) |
|
|
|
if (item.HasSubMenu && item.IsEnabled) |
|
|
|
{ |
|
|
|
Open(item, true); |
|
|
|
} |
|
|
|
@ -441,7 +441,7 @@ namespace Avalonia.Controls.Platform |
|
|
|
{ |
|
|
|
Menu?.Close(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void TopLevelLostPlatformFocus() |
|
|
|
{ |
|
|
|
Menu?.Close(); |
|
|
|
|