我正在为我的公司开发WPF应用程序,并且所有内容的外观都必须与公司的外观相同。因此,我必须创建一个自定义文件夹资源管理器,该资源管理器将具有当前目录的树状视图。
为了简化操作,我制作了以下类,基本上是一个TreeViewItem
,它存储一个DirectoryInfo
并在展开时自动浏览子文件夹(而不是一次浏览所有内容并该软件更快)。这是我的代码:
Private Class TreeViewPlus
Inherits TreeViewItem
Public dir As IO.DirectoryInfo
Public Sub New()
End Sub
Public Sub New(dir As DirectoryInfo)
Me.dir = dir
Try
If Not dir.EnumerateDirectories Is Nothing Then 'If there are subdirectories, I add an empty item to enable the expansion
Me.Items.Add(New TreeViewPlus)
End If
Catch ex As Exception
End Try
End Sub
Private Sub TreeViewPlus_Expanded(sender As Object, e As RoutedEventArgs) Handles Me.Expanded
Me.Items.Clear()
Try
For Each folder In dir.EnumerateDirectories()
Dim item As TreeViewPlus = New TreeViewPlus(folder)
item.Name = Text.RegularExpressions.Regex.Replace(folder.FullName, "[^a-zA-Z0-9]", "")
item.Header = folder.Name
Me.Items.Add(item)
Next
Catch ex As Exception
End Try
End Sub
End Class
这是我初始化第一个目录的代码:(TRV_Arbre是我的TreeView的名称)
Sub New()
...
For Each Drive As IO.DriveInfo In IO.DriveInfo.GetDrives
Dim item As TreeViewPlus = New TreeViewPlus(Drive.RootDirectory)
item.Header = Drive.Name
TRV_Arbre.Items.Add(item)
Next
...
End Sub
我遇到的问题是项目的第一层正确展开,但随后的层却没有。
查看此处:https://youtu.be/E6BJbKal5Sk
我已经调试了一些代码,它可以正确创建不同的项目。
有人可以帮我吗?预先感谢。
答案 0 :(得分:1)
有一个简单的方法可以解决此问题,即重写Base TreeViewItem类上的OnExpanded Sub,而不是实现自己的Expanded方法。然后最后执行MyBase.OnExpanded(e)方法,该方法似乎包含正确的更新事件以发送给任何听众。在这种情况下,您的TreeView。
Protected Overrides Sub OnExpanded(e As RoutedEventArgs)
Me.Items.Clear()
Try
For Each folder In dir.EnumerateDirectories()
Dim item As TreeViewPlus = New TreeViewPlus(folder)
item.Name = Text.RegularExpressions.Regex.Replace(folder.FullName, "[^a-zA-Z0-9]", "")
item.Header = folder.Name
Me.Items.Add(item)
Next
Catch ex As Exception
End Try
MyBase.OnExpanded(e)
End Sub