首页 > 解决方案 > 树视图项目不展开

问题描述

我正在为我的公司开发一个 WPF 应用程序,并且一切都需要与我们公司的外观相同。因此,我必须制作一个自定义文件夹资源管理器,它将具有当前目录的树视图。

为了使它更容易,我制作了以下类,它基本上是一个TreeViewItem存储 aDirectoryInfo并在展开时自动浏览子文件夹(而不是一次浏览所有内容并使软件更快)。这是我的代码:

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

我已经稍微调试了我的代码,它正确地创建了不同的项目。

任何人都可以帮助我吗?提前致谢。

标签: wpfvb.nettreeviewtreeviewitem

解决方案


There is a simple way to solve this problem and that is to Override the OnExpanded Sub on the Base TreeViewItem class instead of implementing your own Expanded method. Then in the end you execute MyBase.OnExpanded(e) method which seems to contain the correct update events to send out to whomever listens. In this case your 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 

推荐阅读