动态过滤和调整上下文菜单的大小,同时保持其重力底部

本文关键字:底部 调整 过滤 上下文 菜单 动态 | 更新日期: 2023-09-27 18:11:36

我有一个系统托盘上下文菜单,有26个项目和一个额外的ToolStripTextBox菜单项。当用户在过滤器文本框中输入文本时,它会不断过滤菜单项作为用户类型,并通过设置ToolStripMenuItem Visible propertyfalse来隐藏类别。

工作!

问题是,当它被过滤时,上下文菜单的高度从底部到顶部变得更短。菜单的原点位于右上角,使其向上收缩。因为它是一个系统托盘相关的上下文菜单,我希望它向下收缩(底部重力)。

如何做到这一点?

动态过滤和调整上下文菜单的大小,同时保持其重力底部

仍然不确定是否有一个"适当的"内置方法来做到这一点…

同时,这里有一个hack,当大小改变时,改变Bounds()的ContextMenuStrip。它只是将ContextMenuStrip向下/向上移动,无论高度变化多少。我已经连接了我的ContextMenuStrip的Opened()和SizeChanged()事件,并将最后的Bounds()存储在类级别的"lastBounds"变量中:

    private Rectangle lastBounds;
    private void contextMenuStrip1_Opened(object sender, EventArgs e)
    {
        lastBounds = contextMenuStrip1.Bounds;
    }
    private void contextMenuStrip1_SizeChanged(object sender, EventArgs e)
    {
        Rectangle rc = contextMenuStrip1.Bounds;
        int diff = lastBounds.Height - rc.Height;
        if (diff > 0)
        {
            contextMenuStrip1.Bounds = new Rectangle(new Point(rc.X, rc.Y + diff), rc.Size);
            lastBounds = contextMenuStrip1.Bounds;
        }
        else
        {
            contextMenuStrip1.Bounds = new Rectangle(new Point(rc.X, rc.Y - diff), rc.Size);
            lastBounds = contextMenuStrip1.Bounds;
        }
    }