C# 当按下菜单键显示Windows窗体上下文菜单时,如何控制其位置?
我有一个自定义的Windows窗体控件,我想在其中添加上下文菜单。自定义控件具有可由键盘或鼠标操作的活动选择。我将自定义控件的C# 当按下菜单键显示Windows窗体上下文菜单时,如何控制其位置?,c#,winforms,C#,Winforms,我有一个自定义的Windows窗体控件,我想在其中添加上下文菜单。自定义控件具有可由键盘或鼠标操作的活动选择。我将自定义控件的ContextMenu属性设置为要显示的上下文菜单。当用户右键单击时,上下文菜单将显示在预期位置 但是,当用户按下Menu键(或等效地按下Shift-F10)时,关联菜单将出现在我的控件的死角。我希望能够控制上下文菜单出现的位置,这取决于控件中的选择位置。这是怎么做到的?它是否也适用于ContextMenuStrip 编辑 我正在写下下面给出答案的有效解决方案。首先,设置
ContextMenu
属性设置为要显示的上下文菜单。当用户右键单击时,上下文菜单将显示在预期位置
但是,当用户按下Menu键(或等效地按下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);
}
}
this.ContextMenu=;
受保护的覆盖无效OnKeyDown(KeyEventArgs e)
{
if(e.KeyData==(Keys.Shift | Keys.F10))
{
Show(这个,newpoint());
e、 已处理=正确;
}
其他的
{
base.OnKeyDown(e);
}
}
这样,您就不必干扰右键单击时显示上下文菜单的逻辑。ContextMenuStrip
的Show()
方法允许您提供显示上下文菜单的控件以及位置
例如,在下面的示例中:
this.contextMenuStrip1.Show(button1, new Point(50, 50));
它将在按钮1的右侧和下方显示50个像素的菜单。仅指定位置时:
this.contextMenuStrip1.Show(new Point(50, 50));
菜单显示在相对于主窗体的位置。上下文菜单提示的Show()
方法允许您提供显示它的控件以及位置
例如,在下面的示例中:
this.contextMenuStrip1.Show(button1, new Point(50, 50));
它将在按钮1的右侧和下方显示50个像素的菜单。仅指定位置时:
this.contextMenuStrip1.Show(new Point(50, 50));
菜单显示在相对于主窗体的位置。上下文菜单提示的Show()
方法允许您提供显示它的控件以及位置
例如,在下面的示例中:
this.contextMenuStrip1.Show(button1, new Point(50, 50));
它将在按钮1的右侧和下方显示50个像素的菜单。仅指定位置时:
this.contextMenuStrip1.Show(new Point(50, 50));
菜单显示在相对于主窗体的位置。上下文菜单提示的Show()
方法允许您提供显示它的控件以及位置
例如,在下面的示例中:
this.contextMenuStrip1.Show(button1, new Point(50, 50));
它将在按钮1的右侧和下方显示50个像素的菜单。仅指定位置时:
this.contextMenuStrip1.Show(new Point(50, 50));
菜单显示在相对于主窗体的位置。如果我选择Show()
的路线,我现在必须手动挂接OnMouseUp
和OnKeyDown
受保护的方法,以便拦截触发菜单的用户操作。这让我很容易遇到bug——我宁愿说“如果菜单是用键盘打开的,在这里显示”在这种情况下,你可能必须覆盖标准的上下文菜单条,实现你自己版本的按键打开-相对于父窗体有一个固定的位置。我对此进行了测试,并在鼠标外壳中使用默认逻辑,在键盘外壳中使用Show()
逻辑。我将标记您的答案,然后编辑我的问题以显示代码的最终外观。如果我选择show()
的路线,我现在必须手动挂接OnMouseUp
和OnKeyDown
受保护的方法,以便拦截触发菜单的用户操作。这让我很容易遇到bug——我宁愿说“如果菜单是用键盘打开的,在这里显示”在这种情况下,你可能必须覆盖标准的上下文菜单条,实现你自己版本的按键打开-相对于父窗体有一个固定的位置。我对此进行了测试,并在鼠标外壳中使用默认逻辑,在键盘外壳中使用Show()
逻辑。我将标记您的答案,然后编辑我的问题以显示代码的最终外观。如果我选择show()
的路线,我现在必须手动挂接OnMouseUp
和OnKeyDown
受保护的方法,以便拦截触发菜单的用户操作。这让我很容易遇到bug——我宁愿说“如果菜单是用键盘打开的,在这里显示”在这种情况下,你可能必须覆盖标准的上下文菜单条,实现你自己版本的按键打开-相对于父窗体有一个固定的位置。我对此进行了测试,并在鼠标外壳中使用默认逻辑,在键盘外壳中使用Show()
逻辑。我将标记您的答案,然后编辑我的问题以显示代码的最终外观。如果我选择show()
的路线,我现在必须手动挂接OnMouseUp
和OnKeyDown
受保护的方法,以便拦截触发菜单的用户操作。这让我很容易遇到bug——我宁愿说“如果菜单是用键盘打开的,在这里显示”在这种情况下,你可能必须覆盖标准的上下文菜单条,实现你自己版本的按键打开-相对于父窗体有一个固定的位置。我对此进行了测试,并在鼠标外壳中使用默认逻辑,在键盘外壳中使用Show()
逻辑。我将标记您的答案,然后编辑我的问题以显示代码的最终外观。