代码之家  ›  专栏  ›  技术社区  ›  Julian

在显示前查找ContextMenuStrip的高度

  •  4
  • Julian  · 技术社区  · 16 年前

    我有一个ContextMenuStrip(CTmenumAssedit),我想在左键单击按钮(BtnAssedit)时显示它。我希望在按钮上方显示ContextMenuStrip,即相对于按钮的位置(0,-ContextMenuStrip.Height):

    private void btnMassEdit_Click(object sender, EventArgs e)
    {
        ctMenuMassEdit.Show(btnMassEdit, new Point(0, -ctMenuMassEdit.Height));
    }
    

    但是,第一次单击按钮时高度属性为0(我假设在第一次显示之前未创建ContextMenuStrip),结果是ContextMenuStrip显示在按钮的顶部。但是,第二次单击按钮时,它显示在正确的位置,因此我的逻辑的基本内容至少是正确的。

    我尝试在显示ContextMenuStrip之前添加以下内容,但没有按预期工作:

    if (!ctMenuMassEdit.Created)
    {
        ctMenuMassEdit.CreateControl();
    }
    

    那么,在第一次显示ContextMenuStrip之前,有没有一种方法可以创建它,这样我就有了正确的高度属性?我当然可以使用显示,隐藏和再次显示的黑客,但这似乎不是真正的整洁…

    2 回复  |  直到 16 年前
        1
  •  2
  •   kildare    16 年前

    怎么样 ctmenumassedit.show(btnassedit,me.pointtoscreen(btnassedit.location),toolstripDropDownDirection.above)右上角;

        2
  •  0
  •   Julian    16 年前

    因为没有其他人有任何建议,我可以分享我的解决方案。这不是一个真正的解决方案,更像是一个黑客,但是如果我第一次隐藏它并再次显示它,它会起作用:

    private void btnMassEdit_Click(object sender, EventArgs e)
    {
        if (ctMenuMassEdit.Height < 5)
        {
            ctMenuMassEdit.Show(btnMassEdit, new Point(0, -ctMenuMassEdit.Height));
            ctMenuMassEdit.Hide();
        }
        ctMenuMassEdit.Show(btnMassEdit, new Point(0, -ctMenuMassEdit.Height));
    }
    

    您可能想知道为什么我要检查高度<5而不是简单的高度==0?好吧,出于某种奇怪的原因,在我第一次显示它之前,ContextMenuStrip的高度似乎是4(不是0,正如人们想象的那样),所以它是黑客内部的另一个黑客;)