为什么第一次单击 C# 中的按钮时 ContextMenuStrip 没有打开?

Why ContextMenuStrip is not opening at first time click from a button in C#?

我目前正在使用 Form 开发矩阵(布局)弹出菜单。在弹出菜单中,有一个 Button。左键单击时该按钮应打开 ContextMenuStrip,而不是右键单击。因此,我没有将 ContextMenuStrip 分配给按钮的 ContextMenuStrip 属性,在 Microsoft Visual Studio 的 Design 面板中。仅供参考,ContextMenuStrip 的位置就在 Button.

的正下方


下面的例子可以帮助你形象化。

如标题所示,我无法在第一次单击按钮时打开 ContextMenuStrip。但是,它适用于下一次点击。我尝试了这些链接中的解决方案,但无济于事:

  1. Solution 1.
  2. .
  3. Solution 3.


下面是涉及的代码(都在MatrixPopupMenu.cs里面):

//global variable
private Point contextStripLocation;

//zoomFactorContextStrip -> name of the ContextMenuStrip object

//the button's click event handler
private void button15_Click(object sender, EventArgs e)
{
    if((e as MouseEventArgs).Button == MouseButtons.Left)
    {
        zoomFactorContextStrip.Show(button15, contextStripLocation);
    }
}

//matrix popup menu's load event handler
private void MatrixPopupMenu_Load(object sender, EventArgs e)
{
    contextStripLocation = new Point(0, this.button15.Height);
}


请问我可以做些什么来解决这个问题?

当我在摆弄 MouseUpMouseDown 事件处理程序时,我设法解决了我自己的问题。

很简单,我只需要两件事:

  1. MouseDown 事件处理程序中,调用 ContextMenuStrip.Close()
  2. MouseUp 事件处理程序中,调用 ContextMenuStrip.Show()

代码如下:

//global variable
private Point contextStripLocation;

//zoomFactorContextStrip -> name of the ContextMenuStrip object

//the button's click event handler
//private void button15_Click(object sender, EventArgs e) -> not used anymore

//instead, replaced with:
//popup menu's mouseup event handler
private void button15_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        this.TopMost = true;
        zoomFactorContextStrip.Show(button15, zoomFactorCSLocation);
    }
}

//popup menu's mousedown event handler
private void button15_MouseDown(object sender, MouseEventArgs e)
{
    zoomFactorContextStrip.Close();
}

//matrix popup menu's load event handler
private void MatrixPopupMenu_Load(object sender, EventArgs e)
{
    contextStripLocation = new Point(0, this.button15.Height);
}

老实说,我真的不知道为什么会这样,但它完全解决了我的问题。它可能与 .

有某种关系