将ToolStripDropDownButton的菜单显示为上下文菜单

时间:2009-02-13 20:37:21

标签: winforms

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

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

Point contextMenuLocation = [get from WM_CONTEXTMENU]
myButton.DropDown.Show( contextMenuLocation );

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

有人对如何做到这一点有好主意吗?

1 个答案:

答案 0 :(得分:2)

使用相同项目填充两个不同下拉列表的一种好方法是将项目创建提取到一个函数中,该函数在打开该下拉列表的任何实例之前构建必要的下拉列表。如果应用程序状态发生变化,这也允许您启用禁用内容。

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;
}