动态过滤和调整上下文菜单的大小,同时保持其重力底部
本文关键字:底部 调整 过滤 上下文 菜单 动态 | 更新日期: 2023-09-27 18:11:36
我有一个系统托盘上下文菜单,有26个项目和一个额外的ToolStripTextBox
菜单项。当用户在过滤器文本框中输入文本时,它会不断过滤菜单项作为用户类型,并通过设置ToolStripMenuItem
Visible property
为false
来隐藏类别。
工作!
问题是,当它被过滤时,上下文菜单的高度从底部到顶部变得更短。菜单的原点位于右上角,使其向上收缩。因为它是一个系统托盘相关的上下文菜单,我希望它向下收缩(底部重力)。
如何做到这一点?
仍然不确定是否有一个"适当的"内置方法来做到这一点…
同时,这里有一个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;
}
}