Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Winfoms Toolstripdropdown关闭按钮单击_C#_.net_Winforms_Toolstrip_Toolstripdropdown - Fatal编程技术网

C#Winfoms Toolstripdropdown关闭按钮单击

C#Winfoms Toolstripdropdown关闭按钮单击,c#,.net,winforms,toolstrip,toolstripdropdown,C#,.net,Winforms,Toolstrip,Toolstripdropdown,我在Windows窗体中使用了toolstripdropdown,在单击另一个按钮时显示按钮列表 var td = new ToolStripDropDown { AutoSize = true, DropShadowEnabled = false, BackColor = Color.Transparent, Margin = Padding.Empty, P

我在Windows窗体中使用了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就会关闭。这没关系

我的要求:

  • 单击“显示”按钮
  • 通过调用td.show()显示toolstripdropdown,如果td.Visible
  • 再次单击“显示”按钮
  • 工具条应关闭
  • 单击表单中的任意位置,如果toolstripdropdown可见,则应将其关闭
  • 现在发生的是,在步骤3中,在引发button click事件之前,toolstripdropdown正在关闭。因此,再次显示下拉列表

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

    您应该处理下拉列表事件,并通过单击打开下拉列表的按钮来设置一个标志,如果下拉列表正在关闭。然后,当您单击按钮时,检查标志,如果没有标志,则显示下拉列表并设置标志,否则关闭下拉列表并清除标志:

    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;
        }
    }
    
    您应该处理下拉列表事件,并通过单击打开下拉列表的按钮来设置关闭下拉列表的标志。然后,当您单击按钮时,检查标志,如果没有标志,则显示下拉列表并设置标志,否则关闭下拉列表并清除标志:

    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;
        }
    }
    
    杰出的“this.button1.Bounds.Contains(this.PointToClient(MousePosition))”这是我漏掉的一行。谢谢。。。。你救了我一天…太好了。。。“this.button1.Bounds.Contains(this.PointToClient(MousePosition))”这是我漏掉的一行。谢谢。。。。你救了我一天。。。。