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

时间:2010-08-27 16:04:04

标签: c# winforms menuitem menu

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

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

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

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

2 个答案:

答案 0 :(得分:2)

我可以确认使用MenuStrip for Framework 2.0,3.5和4.0会发生这种情况。我唯一合理的解决方法是将Visible属性设置为false,因此项目根本不显示。不理想,但比子项目可访问更好。

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

答案 1 :(得分:0)

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

的引用
  

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

     

更具体地说,他们的二传手做同样的事情。所以,如果你   想要隐藏菜单项,您可以将Visible设置为false,或者将其设置为false   可以将Available设置为false。一样。那么为什么会有两个   属性是一样的吗?

     

不同之处在于,如果您想要阅读这些属性,请找出答案   该项目是否已隐藏。可见的吸气剂不起作用   你想要什么。永远不要使用它。阅读可见并没有告诉你“我做过   设置可见为真?“不,这就是可用的。 (明显。)   不,阅读Visible告诉你“是当前弹出的菜单   屏幕?“哪个有用分数小于或等于   to toe fungus。

     

摘要:始终使用可用。永远不要使用Visible。唯一的例外是   表单设计器 - 可用未显示在属性网格中,因此   那里你被Visible困住了。

此致

最高