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

如何基于目录路径字符串数组创建WPF TreeView实现资源管理器式目录展示

WPF TreeView 平铺路径转层级展示实现

核心思路是先将平铺的路径字符串解析为带父子关系的节点集合,再通过WPF的分层数据模板绑定到TreeView,无需依赖复杂递归逻辑,性能稳定。

1. 定义文件夹节点模型

创建通用节点类,存储节点显示名、完整路径、子节点集合:

using System.Collections.ObjectModel;
using System.IO;
using System.Linq;

public class FolderNode
{
    /// <summary>
    /// 节点显示名称(最后一级文件夹名)
    /// </summary>
    public string FolderName { get; set; }
    /// <summary>
    /// 文件夹完整路径
    /// </summary>
    public string FullPath { get; set; }
    /// <summary>
    /// 子文件夹节点集合
    /// </summary>
    public ObservableCollection<FolderNode> Children { get; set; } = new ObservableCollection<FolderNode>();
}

2. 编写平铺路径转层级树的方法

先对路径按长度排序保证父路径优先处理,逐段拆分路径匹配已有节点,不存在则新建:

public ObservableCollection<FolderNode> BuildFolderHierarchy(string[] rawPaths)
{
    var rootNodes = new ObservableCollection<FolderNode>();
    // 按路径长度升序排序,确保父路径在子路径之前处理
    var sortedPaths = rawPaths.OrderBy(p => p.Length, StringComparer.OrdinalIgnoreCase);

    foreach (var path in sortedPaths)
    {
        // 兼容Windows正反斜杠分隔符
        var pathSegments = path.Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
        var currentLevel = rootNodes;
        string currentPath = string.Empty;

        foreach (var segment in pathSegments)
        {
            // 跳过盘符后分隔符产生的空段
            if (string.IsNullOrWhiteSpace(segment)) continue;

            // 拼接当前层级的完整路径
            currentPath = string.IsNullOrEmpty(currentPath) 
                ? segment 
                : Path.Combine(currentPath, segment);

            // 查找当前层级是否已存在同名节点
            var existingNode = currentLevel.FirstOrDefault(n => 
                n.FolderName.Equals(segment, StringComparison.OrdinalIgnoreCase));

            if (existingNode == null)
            {
                existingNode = new FolderNode
                {
                    FolderName = segment,
                    FullPath = currentPath
                };
                currentLevel.Add(existingNode);
            }

            // 进入下一层级处理
            currentLevel = existingNode.Children;
        }
    }
    return rootNodes;
}

3. XAML配置TreeView分层模板

使用HierarchicalDataTemplate定义层级展示规则,直接绑定子节点集合:

<!-- 注意:需要在Window根节点声明模型所在命名空间,例如:
xmlns:local="clr-namespace:YourAppNamespace"
-->
<TreeView x:Name="FolderTreeView" Margin="10">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:FolderNode}"
                                  ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <!-- 可自行添加文件夹图标,更贴近资源管理器样式 -->
                <TextBlock Text="{Binding FolderName}" VerticalAlignment="Center"/>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

4. 后台绑定数据源

在窗口加载逻辑中调用转换方法,将生成的节点集合绑定到TreeView即可:

public MainWindow()
{
    InitializeComponent();
    // 传入你的路径数组
    string[] folderPaths = new string[]
    {
        @"c:\temp\freigabe",
        @"c:\temp\ftptest",
        @"c:\temp\ftptest\testen",
        @"c:\temp\in",
        @"c:\temp\in - Kopie",
        @"c:\temp\in - Kopie\1",
        @"c:\temp\in - Kopie\1\yyy",
        @"c:\temp\in - Kopie\1\yyy\yyyyy",
        @"c:\temp\in - Kopie\2",
        @"c:\temp\in2",
        @"c:\temp\ipadb",
        @"c:\temp\out",
        @"c:\temp\out2",
        @"c:\temp\Processes2",
        @"c:\temp\Processes2\Kassenbelege",
        @"c:\temp\Processes2\Kassenbelege\images",
        @"c:\temp\Processes2\Posteingang",
        @"c:\temp\Processes2\Posteingang\images",
        @"c:\temp\Processes2\Rechnungen",
        @"c:\temp\Processes2\Rechnungen\images",
        @"c:\temp\Processes2\Rechnungen\images\backup",
        @"c:\temp\test"
    };
    FolderTreeView.ItemsSource = BuildFolderHierarchy(folderPaths);
}

可选优化项

  • 引入系统图标API,为节点加载Windows原生文件夹图标,和资源管理器显示完全一致
  • 节点新增时可增加按名称排序逻辑,匹配资源管理器默认排序规则
  • 若路径集合支持动态更新,可扩展增量更新逻辑,避免每次全量重建树结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:36:20