You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将XAML项目迁移至VB.NET WinForms时TreeNode事件绑定错误修复

修复WinForms TreeNode迁移时的“Expression does not produce a value”错误

问题原因

将WPF项目迁移到VB.NET WinForms时,原WPF代码使用System.Windows.Controls.TreeViewItem.Expanded事件实现节点展开后的延迟加载逻辑。但WinForms的TreeNode类中没有名为Expand的事件——Expand是TreeNode的方法(用于主动触发节点展开),不是事件,因此执行AddHandler treeViewItem.Expand, AddressOf tvi_Expanded时会抛出“Expression does not produce a value”错误。

WinForms中与WPF Expanded事件对应的是AfterExpand事件(节点展开完成后触发),或BeforeExpand事件(节点开始展开前触发),这里选择AfterExpand匹配原WPF代码的触发时机。

修复方案

  1. 替换事件绑定目标:将treeViewItem.Expand改为treeViewItem.AfterExpand
  2. 修正事件参数类型:WinForms的AfterExpand事件参数为TreeViewEventArgs,对应调整处理方法参数
  3. 保留原有业务逻辑:节点延迟加载逻辑无需修改

修改后的完整代码

Private Function AddDirectoryNode(parentItemCollection As TreeNode,
                                  directoryDetail As DirectoryDetail) As Boolean
    Dim treeViewItem As TreeNode
    
    treeViewItem = New TreeNode()
    treeViewItem.Tag = directoryDetail
    
    ' 替换为WinForms正确的AfterExpand事件
    AddHandler treeViewItem.AfterExpand, AddressOf tvi_Expanded

    ' 如果目录包含子目录,添加占位节点
    If (directoryDetail.SubDirectoryDetails.Count() > 0) Then
        treeViewItem.Nodes.Add(New TreeNode() With {.Name = "placeholder"})
    End If
    
    ' 将节点添加到父节点集合
    parentItemCollection.Nodes.Add(treeViewItem)
    
    Return True
End Function
    
' 修正事件参数类型为TreeViewEventArgs
Sub tvi_Expanded(sender As Object, e As TreeViewEventArgs)
    Me.ExpandNode(CType(sender, TreeNode))
End Sub
    
Private Sub ExpandNode(tvi As TreeNode)
    If (tvi.Nodes.Count = 1 And CType(tvi.Nodes(0), TreeNode).Name = "placeholder") Then
        tvi.Nodes.Clear()
        For Each directoryDetail As DirectoryDetail In (CType(tvi.Tag, DirectoryDetail).SubDirectoryDetails.OrderBy(Function(x) x.Path))
            Me.AddDirectoryNode(tvi.Nodes.Add(directoryDetail.Path), directoryDetail)
        Next directoryDetail
    End If
End Sub

额外补充

若需要在节点展开前执行逻辑(比如显示等待光标),可改用BeforeExpand事件,示例:

Sub tvi_BeforeExpand(sender As Object, e As TreeViewEventArgs)
    Cursor.Current = Cursors.WaitCursor
End Sub

Sub tvi_AfterExpand(sender As Object, e As TreeViewEventArgs)
    Me.ExpandNode(CType(sender, TreeNode))
    Cursor.Current = Cursors.Default
End Sub

同时绑定BeforeExpand事件:AddHandler treeViewItem.BeforeExpand, AddressOf tvi_BeforeExpand

内容的提问来源于stack exchange,提问作者lemoncher2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:35:21