Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当按下菜单键显示Windows窗体上下文菜单时,如何控制其位置?_C#_Winforms - Fatal编程技术网

C# 当按下菜单键显示Windows窗体上下文菜单时,如何控制其位置?

C# 当按下菜单键显示Windows窗体上下文菜单时,如何控制其位置?,c#,winforms,C#,Winforms,我有一个自定义的Windows窗体控件,我想在其中添加上下文菜单。自定义控件具有可由键盘或鼠标操作的活动选择。我将自定义控件的ContextMenu属性设置为要显示的上下文菜单。当用户右键单击时,上下文菜单将显示在预期位置 但是,当用户按下Menu键(或等效地按下Shift-F10)时,关联菜单将出现在我的控件的死角。我希望能够控制上下文菜单出现的位置,这取决于控件中的选择位置。这是怎么做到的?它是否也适用于ContextMenuStrip 编辑 我正在写下下面给出答案的有效解决方案。首先,设置

我有一个自定义的Windows窗体控件,我想在其中添加上下文菜单。自定义控件具有可由键盘或鼠标操作的活动选择。我将自定义控件的
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()
逻辑。我将标记您的答案,然后编辑我的问题以显示代码的最终外观。