Browse Source

Menu interaction handler fixes.

pull/4795/head
Dariusz Komosiński 6 years ago
parent
commit
858b78b59e
  1. 4
      src/Avalonia.Controls/MenuItem.cs
  2. 18
      src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs

4
src/Avalonia.Controls/MenuItem.cs

@ -101,7 +101,7 @@ namespace Avalonia.Controls
private ICommand? _command; private ICommand? _command;
private bool _commandCanExecute = true; private bool _commandCanExecute = true;
private Popup _popup; private Popup? _popup;
/// <summary> /// <summary>
/// Initializes static members of the <see cref="MenuItem"/> class. /// Initializes static members of the <see cref="MenuItem"/> class.
@ -145,7 +145,7 @@ namespace Avalonia.Controls
{ {
var parent = x as Control; var parent = x as Control;
return parent?.GetObservable(DefinitionBase.PrivateSharedSizeScopeProperty) ?? return parent?.GetObservable(DefinitionBase.PrivateSharedSizeScopeProperty) ??
Observable.Return<DefinitionBase.SharedSizeScope>(null); Observable.Return<DefinitionBase.SharedSizeScope?>(null);
}); });
this.Bind(DefinitionBase.PrivateSharedSizeScopeProperty, parentSharedSizeScope); this.Bind(DefinitionBase.PrivateSharedSizeScopeProperty, parentSharedSizeScope);

18
src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs

@ -148,6 +148,7 @@ namespace Avalonia.Controls.Platform
{ {
case Key.Up: case Key.Up:
case Key.Down: case Key.Down:
{
if (item?.IsTopLevel == true) if (item?.IsTopLevel == true)
{ {
if (item.HasSubMenu && !item.IsSubMenuOpen) if (item.HasSubMenu && !item.IsSubMenuOpen)
@ -161,8 +162,10 @@ namespace Avalonia.Controls.Platform
goto default; goto default;
} }
break; break;
}
case Key.Left: 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.Close();
@ -174,8 +177,10 @@ namespace Avalonia.Controls.Platform
goto default; goto default;
} }
break; break;
}
case Key.Right: case Key.Right:
{
if (item != null && !item.IsTopLevel && item.HasSubMenu) if (item != null && !item.IsTopLevel && item.HasSubMenu)
{ {
Open(item, true); Open(item, true);
@ -186,8 +191,10 @@ namespace Avalonia.Controls.Platform
goto default; goto default;
} }
break; break;
}
case Key.Enter: case Key.Enter:
{
if (item != null) if (item != null)
{ {
if (!item.HasSubMenu) if (!item.HasSubMenu)
@ -202,12 +209,14 @@ namespace Avalonia.Controls.Platform
e.Handled = true; e.Handled = true;
} }
break; break;
}
case Key.Escape: case Key.Escape:
if (item?.Parent != null) {
if (item?.Parent is IMenuElement parent)
{ {
item.Parent.Close(); parent.Close();
item.Parent.Focus(); parent.Focus();
} }
else else
{ {
@ -216,8 +225,10 @@ namespace Avalonia.Controls.Platform
e.Handled = true; e.Handled = true;
break; break;
}
default: default:
{
var direction = e.Key.ToNavigationDirection(); var direction = e.Key.ToNavigationDirection();
if (direction.HasValue) if (direction.HasValue)
@ -246,6 +257,7 @@ namespace Avalonia.Controls.Platform
} }
break; break;
}
} }
if (!e.Handled && item?.Parent is IMenuItem parentItem) if (!e.Handled && item?.Parent is IMenuItem parentItem)

Loading…
Cancel
Save