按菜单键显示Windows Forms ContextMenu时如何控制它的位置?

How to control the location of Windows Forms ContextMenu when it is shown by pressing the Menu key?

我有一个自定义 Windows 表单控件,我想向其添加上下文菜单。自定义控件具有可通过键盘或鼠标操作的活动选择。我将自定义控件的 ContextMenu 属性设置为我希望显示的上下文菜单。当用户右键单击时,上下文菜单会出现在预期的位置。

但是,当用户按下菜单键(或等效地,Shift-F10)时,上下文菜单出现在我控件的死点。我希望能够根据选择在控件中的位置来控制上下文菜单出现的位置。这是怎么做到的?它也适用于 ContextMenuStrip 吗?

编辑

我正在根据以下答案编写可行的解决方案。首先,设置 ContextMenu 属性(或 ContextMenusStrip 属性,视情况而定)。然后,覆盖 OnKeyDown 方法以拦截 Shift-F10,并在这种情况下执行显式 Show()

this.ContextMenu = <my context menu>;

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyData == (Keys.Shift|Keys.F10)) 
    {
        ContextMenu.Show(this, new Point(<x and y coordinates as appropriate>));
        e.Handled = true;
    } 
    else
    {
        base.OnKeyDown(e);
    }
}

这样,您就不必理会右键单击时显示上下文菜单的逻辑。

ContextMenuStripShow() 方法允许您提供显示它的控件以及位置。

例如下面的例子:

this.contextMenuStrip1.Show(button1, new Point(50, 50));

它将在 button1 右侧下方 50 像素处显示菜单。并且仅指定位置时:

this.contextMenuStrip1.Show(new Point(50, 50));

菜单显示在相对于主窗体的位置。