【问题标题】:Find height of ContextMenuStrip before showing it在显示之前查找 ContextMenuStrip 的高度
【发布时间】:2011-02-12 18:10:51
【问题描述】:

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

【问题讨论】:

    标签: c# .net winforms contextmenustrip


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我不知道 ToolStripDropDownDirection 选项。像魅力一样工作!我的最终代码最终看起来像这样:ctMenuMassEdit.Show(btnMassEdit, new Point(0, 0), ToolStripDropDownDirection.AboveRight);
    【解决方案2】:

    由于没有其他人有任何建议,我只能分享最终成为我的解决方案的内容。这不是一个真正的解决方案,更像是一个 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));
    }
    

    您可能想知道为什么我检查高度

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2010-12-22
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多