2016-04-21 4 views
2

Я использовал toolstripdropdown в своей форме Windows, чтобы отобразить список кнопок при нажатии другой кнопки.C# Winfoms Toolstripdropdown close on button click

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. –