如何从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; }
关键修改说明
- 判断空文件夹并跳过:处理子文件夹时,先异步获取其内容,若为空则直接跳过,不创建对应的TreeViewNode。
- 修正文件过滤逻辑:将原代码中遇到不允许的文件时的
return改为continue,避免终止整个遍历过程,确保后续符合要求的文件和文件夹能正常加载。 - 优化空根文件夹处理:当根文件夹为空时,设置
node.HasUnrealizedChildren = false,隐藏折叠箭头,避免误导用户认为还有未加载内容。
内容的提问来源于stack exchange,提问作者Chibako
相关产品推荐
相关产品推荐

