Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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# 如何将ContextMenuStrip添加到ToolStripButton?_C#_Winforms_Contextmenustrip_Toolstripbutton - Fatal编程技术网

C# 如何将ContextMenuStrip添加到ToolStripButton?

C# 如何将ContextMenuStrip添加到ToolStripButton?,c#,winforms,contextmenustrip,toolstripbutton,C#,Winforms,Contextmenustrip,Toolstripbutton,我有一个toolstrip,其中包括一个ToolStripComboBox和一个ToolStripButton。我想向这两个工具添加ContextMenuStrip,但我无法直接访问toolstrip或其其他内容,因此无法设置toolstrip的上下文菜单 为ToolStripComboBox设置ContextMenuStrip很容易: myToolStripComboBox.ComboBox.ContextMenuStrip = myContextMenu; 但是ToolStripButto

我有一个toolstrip,其中包括一个ToolStripComboBox和一个ToolStripButton。我想向这两个工具添加ContextMenuStrip,但我无法直接访问toolstrip或其其他内容,因此无法设置toolstrip的上下文菜单

为ToolStripComboBox设置ContextMenuStrip很容易:

myToolStripComboBox.ComboBox.ContextMenuStrip = myContextMenu;

但是ToolStripButton没有明显的等价物。如何将ContextMenuStrip添加到ToolStripButton?

这是因为ToolStripComboBox包含“System.Windows.Forms.ComboBox”控件,但“ToolStripButton”不包含“System.Windows.Forms.control”。其特殊的toolstrip项,其按钮由toolstip维护


您应该在toolstip上使用ContextMenu,或者您可以将下拉菜单添加到toolstripbutton项。

您需要将上下文菜单设置为ToolStrip,然后处理上下文菜单的弹出或相关事件,并点击测试鼠标在哪个按钮上,以确定是否应显示ToolStrip的上下文菜单以及应该显示的内容包含。

好问题。您可以访问父级
toolstrip
myToolStripButton.parent
或类似内容),并将上下文菜单附加到那里。

Jeff Yates的建议应该有效

但是,另一种选择是创建您自己的派生类(MyToolSTripButton、MyToolStripTextBox…等),为这些项提供一个ContextMenuStrip属性,您可以在设计时设置该属性,并让您的派生类检测鼠标右键,或者任何其他事件将触发上下文菜单的显示

这将把所需的任何知识转移到只感兴趣的项目上

下面是一个使用ToolStripTextBox作为项目的示例

public class MyTextBox : ToolStripTextBox
{
    ContextMenuStrip _contextMenuStrip;

    public ContextMenuStrip ContextMenuStrip
    {
        get { return _contextMenuStrip; }
        set { _contextMenuStrip = value; }
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            if (_contextMenuStrip !=null)
                _contextMenuStrip.Show(Parent.PointToScreen(e.Location));
        }
    }
}

小事情:我想大多数人会发现使用
contextMenu.Show(Cursor.Position)更合适
而不是
父.PointToScreen(e.Location)
business,后者通常只为第一个ToolStripItem正确定位菜单