水如烟

                 顺其自然,水到渠成 LzmTW

文或代码皆是面向初学者.我是爱好者,也是初学者.那些"文章",只按自己理解写,我是不知术语名词的.所以只供参考,也仅供参考.

导航

ToolStripItem的Visible那样读取有没有道理

Posted on 2006-08-15 18:30  水如烟(LzmTW)  阅读(596)  评论(1编辑  收藏  举报


我本意是定制菜单(WinForm),根据用户角色对某些项设为Visible=False不显示,有些显示但不作用设为Enabled=False.
系统管理员的界面显示所有菜单,并且通过设置某些菜单的Visible、Enabled来生成一个配置文件,供相应角色的用户使用。

在读取配置文件后发现,ToolStripItem的Visible值除了一级菜单那些项是正确的,二级及以下的菜单项,不管真实Visible是“真”是“假”,读出来的值全是“假”。
为此,Reflector了一下这个Visible,代码如下:

<SRDescription("ToolStripItemVisibleDescr"), Localizable(True), SRCategory("CatBehavior")> _
Public Property Visible As Boolean
      Get
            If ((Not Me.ParentInternal Is Nothing) AndAlso Me.ParentInternal.Visible) Then
                  Return Me.Available
            End If
            Return False
      End Get
      Set(ByVal value As Boolean)
            Me.SetVisibleCore(value)
      End Set
End Property

果是有文章。
MSDN文档中如此写道:

ToolStripItem.Visible 属性
注意:此属性在 .NET Framework 2.0 版中是新增的。
获取或设置一个值,该值指示是否显示该项。

那应该是不正确的了,哪能获取指示是否显示该项呢?

测试:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim item As New ToolStripMenuItem
    Console.WriteLine(item.Visible)
    '结果:False
    Me.MainMenuStrip.Items.Add(item)
    Console.WriteLine(item.Visible)
    '结果:True
End Sub

另,ToolStripItem也提供了VisibleChanged事件,
MSDN文档中说,

ToolStripItem.VisibleChanged 事件
注意:此事件在 .NET Framework 2.0 版中是新增的。
当 Visible 属性的值更改时发生。

由于读取太特别了,除了一级菜单能激发事件外,其它的都不能激发。
测试:
Private Sub NewToolStripMenuItem_VisibleChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewToolStripMenuItem.VisibleChanged
    Console.WriteLine("New VisibleChanged")
    '结果:不能显示
End Sub

Private Sub FileToolStripMenuItem_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles FileToolStripMenuItem.VisibleChanged
    Console.WriteLine("File VisibleChanged")
    '结果:正常显示
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    Me.NewToolStripMenuItem.Visible = Not Me.NewToolStripMenuItem.Visible
    Me.FileToolStripMenuItem.Visible = Not Me.FileToolStripMenuItem.Visible
End Sub

现在,这个Visible在实现我的功能里是不能使用了。真不明白,这样的Visible读取有没有道理?