2009-02-13 61 views
0

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

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

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

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

有没有人有如何完成这个好主意?

回答

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

感谢您的想法。我曾想过这样做,我可能会这样做。我仍然有兴趣知道是否有一种简单的方法可以不动态地填充菜单,例如用于菜单通过设计者构建的情况。 – Charlie 2009-02-14 00:37:22