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

动态过滤和调整上下文菜单c#的大小,同时保持其重力到底部,c#,filter,resize,contextmenu,gravity,C#,Filter,Resize,Contextmenu,Gravity,我有一个包含26项的系统托盘上下文菜单和一个附加的ToolStripTextBox菜单项。当用户向过滤器文本框输入文本时,它通过将ToolStripMenuItem可见属性设置为false,在用户键入和隐藏类别时连续过滤菜单项 它起作用了 问题是,当它被过滤时,上下文菜单的高度从底部向顶部变短。菜单的原点位于右上角,使其向上收缩。由于它是一个与系统托盘相关的上下文菜单,我希望它向下收缩(底部重力) 如何做到这一点?仍然不确定是否有“适当”的内置方法来实现这一点 同时,这里有一个技巧,每当大小改变

我有一个包含26项的系统托盘上下文菜单和一个附加的
ToolStripTextBox
菜单项。当用户向过滤器文本框输入文本时,它通过将
ToolStripMenuItem
可见属性设置为
false
,在用户键入和隐藏类别时连续过滤菜单项

它起作用了

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


如何做到这一点?

仍然不确定是否有“适当”的内置方法来实现这一点

同时,这里有一个技巧,每当大小改变时,就会改变ContextMenuStrip的Bounds()。它只是简单地将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;
        }
    }

谢谢这是一个聪明的解决方案,虽然这在一定程度上对我有效,但问题是当我不断更改过滤器组件中的文本时,上下文菜单的大小不断变化,当添加文本->较短文本时,以及当删除文本->较高文本时。在第一个过滤器之后,差异大小不再表示“正确”的差异,上下文菜单也移到了随机位置。啊……你的描述只提到了收缩,所以我只考虑了这一点。我会看看是否可以修改它来处理收缩和增长。另一种解决方案是关闭ContextMenuStrip的AutoSize,以便在删除项时保持相同大小。不确定这是否是您的选项。我在SizeChanged()处理程序中添加了一个ELSE块,以便在ContextMenuStrip()增长时将其向后移动。