2016-04-21 65 views
2

我在Windows窗體中使用了toolstripdropdown來顯示另一個按鈕的單擊按鈕列表。C#Winfoms Toolstripdropdown關閉按鈕單擊

var td = new ToolStripDropDown 
     { 
      AutoSize = true, 
      DropShadowEnabled = false, 
      BackColor = Color.Transparent, 
      Margin = Padding.Empty, 
      Padding = Padding.Empty 
     }; 

     var host = new ToolStripControlHost(panel) 
     { 
      BackColor = Color.Transparent, 
      Margin = Padding.Empty, 
      Padding = Padding.Empty 
     }; 

     td.Items.Add(host); 

面板包含要顯示的按鈕列表。要將面板顯示給用戶,請在按鈕(顯示)上單擊下一行。

td.Show(pointonScreen); 

默認情況下,AutoClose設置爲true。因此,無論用戶何時點擊表單中的任何位置,toolstripdropdown都會關閉。還行吧。

我的要求:

  1. 點擊查看按鈕
  2. 顯示toolstripdropdown通過調用td.show()並關閉彈出窗口,如果td.Visible
  3. 再次單擊顯示按鈕
  4. toolstripdrown應該被關閉
  5. 單擊表格中的任意位置,如果可見,則應關閉toolstripdropdown

現在發生的情況是,在步驟3中,在按鈕單擊事件發生之前,toolstripdropdown正在關閉。所以再次顯示下拉菜單。

有沒有其他辦法可以達到我的要求?

回答

3

你應該處理Closing事件的下拉菜單,並設置一個標誌,如果下拉是關閉點擊打開它的按鈕。然後當你點擊按鈕,檢查標誌,如果沒有一個標誌,顯示下拉並設置標誌,否則關閉下拉並清除標誌:

ToolStripDropDown td; 
private void Form1_Load(object sender, EventArgs e) 
{ 
    td = new ToolStripDropDown { /*...*/}; 
    var host = new ToolStripControlHost(this.panel1){ /*...*/}; 
    td.Items.Add(host); 
    td.Closing += td_Closing; 
} 
void td_Closing(object sender, ToolStripDropDownClosingEventArgs e) 
{ 
    if (e.CloseReason == ToolStripDropDownCloseReason.AppClicked) 
     if (this.button1.Bounds.Contains(this.PointToClient(MousePosition))) 
     { 
      td.Tag = true; 
      return; 
     } 
    td.Tag = null; 
} 
private void button1_Click(object sender, EventArgs e) 
{ 
    if (td.Tag == null) 
    { 
     td.Show(Cursor.Position); 
     td.Tag = true; 
    } 
    else 
    { 
     td.Close(); 
     td.Tag = null; 
    } 
} 
+0

優秀...「this.button1。 Bounds.Contains(this.PointToClient(MousePosition))「這是我錯過的路線。非常感謝....你拯救了我的一天.... – Rocky

+0

不客氣@Rocky。 –