C# Winfoms Toolstripdropdown закрывается при нажатии кнопки

Я использовал toolstripdropdown в своей форме Windows, чтобы показать список кнопок при нажатии другой кнопки.

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. Поэтому всякий раз, когда пользователь щелкает в любом месте формы, раскрывающийся список инструментов закрывается. Хорошо.

Мои требования:

  1. Нажмите кнопку Показать
  2. Отобразите раскрывающийся список инструментов, вызвав td.show(), и закройте всплывающее окно, если td.Visible
  3. Снова нажмите кнопку Показать
  4. toolstripdown должен быть закрыт
  5. Щелкните в любом месте формы, раскрывающийся список инструментов должен быть закрыт, если он виден.

Что происходит сейчас, так это то, что на шаге 3, до того, как будет вызвано событие нажатия кнопки, toolstripdropdown закрывается. Итак, снова отображается раскрывающийся список.

Есть ли другой способ выполнить мои требования?


person Rocky    schedule 21.04.2016    source источник


Ответы (1)


Вы должны обрабатывать 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;
    }
}
person Reza Aghaei    schedule 21.04.2016
comment
Отлично... this.button1.Bounds.Contains(this.PointToClient(MousePosition)) это строка, которую я пропустил. Большое спасибо.... вы спасли мой день.... - person Rocky; 21.04.2016