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

如何从TreeView中移除或跳过空文件夹?

移除TreeView中的空文件夹

我实现了一个TreeView控件,可从指定路径加载所有文件和文件夹。代码运行正常,但TreeView中会显示空文件夹,我希望能跳过这些空文件夹,不知道该怎么实现。

原实现代码

private async void FillTreeNode(TreeViewNode node)
{
    // 获取当前树节点代表的文件夹内容,将每个项作为子节点添加

    // 仅处理文件夹且子节点未加载的情况
    StorageFolder folder = null;

    if (node.Content is StorageFolder && node.HasUnrealizedChildren == true)
    {
        folder = node.Content as StorageFolder;
    }
    else
    {
        // 不是文件夹或已加载子节点,直接返回
        return;
    }

    IReadOnlyList<IStorageItem> itemsList = await folder.GetItemsAsync();

    if (itemsList.Count == 0)
    {
        // 文件夹为空,保留HasUnrealizedChildren=true以显示箭头,但不处理子项
        return;
    }

    foreach (var item in itemsList)
    {
        var newNode = new TreeViewNode();
        newNode.Content = item;

        if (item is StorageFolder)
        {
            // 如果是文件夹,设置HasUnrealizedChildren=true以显示折叠箭头
            newNode.HasUnrealizedChildren = true;
        }
        else
        {
            if (item is StorageFile storageFile)
            {
                if (!AllowedExtensions.Contains(storageFile.FileType))
                {
                    return;
                }
            }
            // 文件类型无需额外处理
        }

        node.Children.Add(newNode);
    }

    // 子节点已添加,设置HasUnrealizedChildren为false
    node.HasUnrealizedChildren = false;
}

使用示例

StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(rootPath);
TreeViewNode itemNode = new TreeViewNode();
itemNode.Content = storageFolder;
itemNode.IsExpanded = true;
itemNode.HasUnrealizedChildren = true;
sampleTreeView.RootNodes.Add(itemNode);
FillTreeNode(itemNode);

解决方案

要跳过空文件夹,核心是在添加文件夹节点前先判断该文件夹是否为空,为空则不创建节点。同时还要修正原代码中遇到不允许的文件类型直接终止方法的问题(应改为跳过该文件)。

修改后的代码如下:

private async void FillTreeNode(TreeViewNode node)
{
    // 获取当前树节点代表的文件夹内容,将每个项作为子节点添加

    // 仅处理文件夹且子节点未加载的情况
    StorageFolder folder = node.Content as StorageFolder;
    if (folder == null || !node.HasUnrealizedChildren)
    {
        // 不是文件夹或已加载子节点,直接返回
        return;
    }

    IReadOnlyList<IStorageItem> itemsList = await folder.GetItemsAsync();

    if (itemsList.Count == 0)
    {
        // 当前文件夹为空,标记为已加载(隐藏箭头),不再添加子节点
        node.HasUnrealizedChildren = false;
        return;
    }

    foreach (var item in itemsList)
    {
        if (item is StorageFile storageFile)
        {
            // 跳过不符合扩展名要求的文件
            if (!AllowedExtensions.Contains(storageFile.FileType))
            {
                continue;
            }
            // 创建文件节点并添加
            var fileNode = new TreeViewNode { Content = storageFile };
            node.Children.Add(fileNode);
        }
        else if (item is StorageFolder subFolder)
        {
            // 判断子文件夹是否为空
            var subItems = await subFolder.GetItemsAsync();
            if (subItems.Count == 0)
            {
                // 空文件夹,跳过不添加
                continue;
            }
            // 创建非空文件夹节点并添加
            var folderNode = new TreeViewNode
            {
                Content = subFolder,
                HasUnrealizedChildren = true
            };
            node.Children.Add(folderNode);
        }
    }

    // 子节点已添加,标记为已加载
    node.HasUnrealizedChildren = false;
}

关键修改说明

  1. 判断空文件夹并跳过:处理子文件夹时,先异步获取其内容,若为空则直接跳过,不创建对应的TreeViewNode。
  2. 修正文件过滤逻辑:将原代码中遇到不允许的文件时的return改为continue,避免终止整个遍历过程,确保后续符合要求的文件和文件夹能正常加载。
  3. 优化空根文件夹处理:当根文件夹为空时,设置node.HasUnrealizedChildren = false,隐藏折叠箭头,避免误导用户认为还有未加载内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:35:16