2009-02-13 90 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