【问题标题】:Display the menu for a ToolStripDropDownButton as a context menu将 ToolStripDropDownButton 的菜单显示为上下文菜单
【发布时间】:2009-02-13 20:37:21
【问题描述】:

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

我尝试了以下代码,但它不起作用(它在正常位置显示按钮的下拉菜单,直接在按钮下方):

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

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

有人知道如何做到这一点吗?

【问题讨论】:

    标签: winforms


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的想法。我曾想过这样做,我可能最终会走这条路。我仍然很想知道是否有一种简单的方法可以在不动态填充菜单的情况下做到这一点,例如对于通过设计器构建菜单的情况。
    • 我找不到任何其他好的解决方案,所以我认为这是我最好的选择。
    • 关闭下拉菜单后,如何将项目添加回原始菜单?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多