C# ContextMenuStrip如何强制更新(大小错误b/c我隐藏了其中的一些项)

C# ContextMenuStrip如何强制更新(大小错误b/c我隐藏了其中的一些项),c#,.net,winforms,contextmenustrip,C#,.net,Winforms,Contextmenustrip,我在一个ContextMenuStrip中有10个项目。我有一个开始事件处理程序,它决定10个项目中哪一个是可见的。基于应用程序逻辑,我可以通过设置Visible=false和Enabled=false来隐藏其中的许多 在显示6/10的情况下会发生什么。他们将是一个4区菜单项高度的空白空间,我第一次点击该条。如果我右键单击使它第二次出现,它会显示在它应该出现的位置。所以,这个条带基本上是为一个10项的条带计算的位置,而实际上它只是一个6项的条带 如何强制它重新计算? 以下是我尝试过的一些方法:

我在一个ContextMenuStrip中有10个项目。我有一个开始事件处理程序,它决定10个项目中哪一个是可见的。基于应用程序逻辑,我可以通过设置Visible=false和Enabled=false来隐藏其中的许多

在显示6/10的情况下会发生什么。他们将是一个4区菜单项高度的空白空间,我第一次点击该条。如果我右键单击使它第二次出现,它会显示在它应该出现的位置。所以,这个条带基本上是为一个10项的条带计算的位置,而实际上它只是一个6项的条带

如何强制它重新计算?

以下是我尝试过的一些方法:

        contextMenuStrip1.Refresh();
        contextMenuStrip1.Update();
        contextMenuStrip1.PerformLayout();
        contextMenuStrip1.AutoSize = true;

        ToolStripItem tempItem = contextMenuStrip1.Items.Add("temp");
        contextMenuStrip1.Items.Remove(tempItem);

        contextMenuStrip1.Refresh();
        contextMenuStrip1.Update(); 

        contextMenuStrip1.Invalidate();

您尝试过使用Invalidate()吗

从MSDN:

使控件的整个表面无效并导致控件失效 重新绘制。(从控件继承。)

也许您需要使用WM_PAINT message,我发现有时您需要在Winforms中使用SendMessage(Interop)

我发现

AutoSize = false;
AutoSize = true;
在所有项目操作工作完成后。还没有找到其他解决方案


在我的例子中,我在打开时添加项目(窗口的动态列表),有时项目标题比菜单长。

谢谢你的建议。我不能再去测试了。但是,当我这样做的时候,我会回头看。