Winforms 将ToolStripDropDownButton的菜单显示为关联菜单

Winforms 将ToolStripDropDownButton的菜单显示为关联菜单,winforms,Winforms,我有一个包含ToolStripDropDownButton的工具条。作为另一种访问方法,当用户右键单击工具条下方的区域时,我还希望能够将此按钮的下拉菜单显示为上下文菜单 我尝试了以下代码,但没有成功(它在按钮正下方的正常位置显示了按钮的下拉列表): 我能想到的最好办法是将toolstrip项从按钮下拉列表复制到ContextMenuStrip中,但我看不到任何简单的方法(ToolStripItem不实现IClonable或Clone方法)。工具条项存储对其父项的引用,因此我不能只将现有项添加到上

我有一个包含ToolStripDropDownButton的工具条。作为另一种访问方法,当用户右键单击工具条下方的区域时,我还希望能够将此按钮的下拉菜单显示为上下文菜单

我尝试了以下代码,但没有成功(它在按钮正下方的正常位置显示了按钮的下拉列表):

我能想到的最好办法是将toolstrip项从按钮下拉列表复制到ContextMenuStrip中,但我看不到任何简单的方法(ToolStripItem不实现IClonable或Clone方法)。工具条项存储对其父项的引用,因此我不能只将现有项添加到上下文菜单中,因为这样会破坏按钮


有人对如何实现这一点有好的想法吗?

用相同的项填充两个不同的下拉列表的一个好方法是将项创建提取到一个函数中,该函数在打开该下拉列表的任何实例之前构建必要的下拉列表。这还允许您在应用程序状态更改时启用禁用功能

class A
{
    public A()
    {
        button = new ToolStripDropDownButton();
        button.DropDown = new ToolStripDropDown();

        ToolStripDropDown dropDown = new ToolStripDropDown();
        dropDown.Opening += DropDownOpening;
        menu.Items.DropDown = dropDown;

    }

    void DropDownOpening(object sender, EventArgs e)
    {
        ToolStripDropDown dropDown = sender as ToolStripDropDown;
        if(dropDown != null) 
        {
            dropDown.Items.Clear();
            BuildMenu(dropDown);
        }
        else
        {
            // throw if you like
        }
    }

    void BuildMenu(ToolStripDropDown dropDown)
    {
        // TODO : Add items to dropdown
        // TODO : Take decisions depending on current application state
    }

    ToolStripDropDownButton button;
    MenuStrip menu;
}

谢谢你的主意。我曾经想过要这样做,我可能最终会这样做。我仍然有兴趣知道是否有一种不动态填充菜单的简单方法,例如,对于通过设计器构建菜单的情况。我找不到任何其他好的解决方案,因此我认为这是我的最佳选择。关闭下拉菜单后,如何将项目添加回原始菜单?
class A
{
    public A()
    {
        button = new ToolStripDropDownButton();
        button.DropDown = new ToolStripDropDown();

        ToolStripDropDown dropDown = new ToolStripDropDown();
        dropDown.Opening += DropDownOpening;
        menu.Items.DropDown = dropDown;

    }

    void DropDownOpening(object sender, EventArgs e)
    {
        ToolStripDropDown dropDown = sender as ToolStripDropDown;
        if(dropDown != null) 
        {
            dropDown.Items.Clear();
            BuildMenu(dropDown);
        }
        else
        {
            // throw if you like
        }
    }

    void BuildMenu(ToolStripDropDown dropDown)
    {
        // TODO : Add items to dropdown
        // TODO : Take decisions depending on current application state
    }

    ToolStripDropDownButton button;
    MenuStrip menu;
}