/// <summary> /// Raises the KeyUp event. /// </summary> /// <param name="e">A KeyEventArgs that contains the event data.</param> protected override void OnKeyUp(KeyEventArgs e) { // Cannot process a message for a disposed control if (!IsDisposed) { // Do we have a manager for processing key messages? ViewManager?.KeyUp(e); } // Let base class fire events base.OnKeyUp(e); }
/// <summary> /// Key has been pressed down. /// </summary> /// <param name="c">Reference to the source control instance.</param> /// <param name="e">A KeyEventArgs that contains the event data.</param> /// <exception cref="ArgumentNullException"></exception> public virtual void KeyDown(Control c, KeyEventArgs e) { Debug.Assert(c != null); Debug.Assert(e != null); // Validate incoming references if (c == null) { throw new ArgumentNullException(nameof(c)); } if (e == null) { throw new ArgumentNullException(nameof(e)); } switch (e.KeyCode) { case Keys.Enter: case Keys.Space: // Only interested in enabled items if (_menuItem.ItemEnabled) { // Do we press the item or show the sub menu? if (!_menuItem.HasSubMenu) { PressMenuItem(); } else { _menuItem.ShowSubMenu(true); } } break; case Keys.Tab: ViewManager.KeyTab(e.Shift); break; case Keys.Home: ViewManager.KeyHome(); break; case Keys.End: ViewManager.KeyEnd(); break; case Keys.Up: ViewManager.KeyUp(); break; case Keys.Down: ViewManager.KeyDown(); break; case Keys.Left: // We wrap if are the first context menu shown, rather than a sub menu showing if (ViewManager.KeyLeft(!_menuItem.HasParentMenu)) { // User tried to fall off the left edge, so dismiss ourself and let the // keyboard access take us back to the owning context menu instance _menuItem.DisposeContextMenu(); } break; case Keys.Right: // If enabled and with a sub menu, then show the sub menu if (_menuItem.ItemEnabled && _menuItem.HasSubMenu) { _menuItem.ShowSubMenu(true); } else { ViewManager.KeyRight(); } break; } }