在显示ContextMenuStrip之前查找它的高度

时间:2010-04-27 07:59:14

标签: c# .net winforms contextmenustrip

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

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

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

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

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

那么,有没有办法在第一次显示ContextMenuStrip之前创建它,所以我有正确的Height属性?我当然可以使用显示它的黑客,隐藏它并再次显示它,但这看起来并不是很整洁......

2 个答案:

答案 0 :(得分:2)

怎么样? ctMenuMassEdit.Show(btnMassEdit,Me.PointToScreen(btnMassEdit.Location),ToolStripDropDownDirection.AboveRight);

答案 1 :(得分:0)

由于没有其他人有任何建议,我可以分享最终成为我解决方案的内容。它不是一个真正的解决方案,更像是一个黑客攻击,但如果我隐藏它并在第一次再显示它,它就会起作用:

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));
}

你可能想知道为什么我检查Height&lt; 5而不是简单的高度== 0?好吧,由于一些奇怪的原因,ContextMenuStrip似乎在我第一次显示它之前的高度为4(不是0,正如人们所假设的那样),所以它是hack中的另一个hack;)