4

我在我的 Windows 表单中使用了 tooltripdropdown 来显示单击另一个按钮时的按钮列表。

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. 通过调用 td.show() 显示工具条下拉菜单并关闭弹出窗口td.Visible
  3. 再次单击显示按钮
  4. toolstripdown 应该关闭
  5. 单击表单中的任意位置,toolstripdropdown 如果可见则应关闭

现在发生的事情是,在第 3 步中,在引发按钮单击事件之前,toolstripdropdown 正在关闭。所以再次显示下拉菜单。

有没有其他方法可以达到我的要求?

4

1 回答 1

6

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;
    }
}
于 2016-04-21T11:45:18.507 回答