Winforms中的禁用菜单项仍显示子项

如果我创建一个包含两个项目的菜单(比如“Item1”和“Item2”,然后在每个项下创建两个子项(1A,1B,2A和2B),然后禁用Item1,我希望1A和1B不会’显示。

事实上,如果我转到Item1,他们就不会。 除非我转到Item2,等待2A和2B显示,然后再回到Item1。 此时1A和1B都弹出,完全激活。

这是一个已知的错误? 这是我可以解决的问题吗? 有什么建议?

用户希望能够看到当前被禁用的东西,或者我只是让事物变得不可见。 遗憾的是,这不是我们可以轻易使用的选项。

我可以确认这是通过MenuStrip for Framework 2.0,3.5和4.0实现的。 我唯一合理的解决方法是将Visible属性设置为false ,因此该项目根本不显示。 不理想,但比子项目可访问更好。

当然你也可以创建一个递归禁用所有子项的函数,即使它们出现,它们至少被禁用,你需要保持以前的状态,以确保以后不再重新启用子项这实际上是打算被禁用等。文档表明这实际上是发生了什么,但事实并非如此,即使父项被禁用,子项仍保持启用状态。

我遇到了同样的问题,并希望在答案中添加几个字。 您可能希望在从菜单项inheritance的单独控件中实现Chris Taylor提到的workaroud,并进行unit testing。 在这种情况下,您需要使用Available属性而不是Visible。 以下是http://blog.excastle.com/2008/12/28/fixing-menustrip-part-2-visible-vs-available-and-a-repro-case/的引用

ToolStripMenuItem有两个可见性属性:Visible和Available。 他们都做同样的事情,除非他们不这样做。

更具体地说,他们的二传手都做同样的事情。 因此,如果要隐藏菜单项,可以将Visible设置为false,也可以将Available设置为false。 一样。 那么为什么同一件事有两个属性呢?

区别在于您是否想要阅读属性,以确定该项是否已被隐藏。 可见的吸气剂不能做你想要的。 永远不要使用它。 Reading Visible并没有告诉你“我将Visible设置为true吗?”不,这就是可用的。 (显然。)不,阅读Visible告诉你“屏幕上当前弹出的菜单是什么?”它的有用性分数小于或等于真菌。

总结:始终使用Available。 永远不要使用Visible。 唯一的例外是表单设计器 – 可用未显示在属性网格中,因此您仍然坚持使用Visible。

问候,

马克斯