4

我有一个 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 属性?我当然可以使用显示它的技巧,隐藏它并再次显示它,但这似乎并不整洁......

4

2 回答 2

2

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

于 2010-06-02T02:42:01.773 回答
0

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

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 < 5 而不仅仅是 Height == 0?好吧,由于某种奇怪的原因,在我第一次显示之前,ContextMenuStrip 的高度似乎为 4(不是 0,正如人们所假设的那样),所以它是 hack 内部的另一个 hack ;)

于 2010-05-25T06:47:38.370 回答