C#递归获取文件夹下所有文件 并绑定到 TreeView控件中
导言:C#递归获取文件夹下所有文件 并绑定到 WPF TreeView控件中 代码片段
一、代码片段
1、前端代码:
<TreeView x:Name="BookMarkTree" SelectedItemChanged="BookMarkTree_SelectedItemChanged" BorderThickness="2" >
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
2、后端代码
//待绑定的数据节点
public class Node
{
public string Name { get; set; }
public List<Node> Children { set; get; }
public Node()
{
Children = new List<Node>();
}
}
//递归获取文件并生成节点
public Node GetChildren(DirectoryInfo directoryInfo)
{
Node node = new Node() { Name = directoryInfo.Name };
var subDirectory = directoryInfo.GetDirectories();
var files = directoryInfo.GetFiles();
if(files.Length !=0)
{
foreach (var item in files)
{
//获取文件名,去除后缀
node.Children.Add(new Node { Name = item.Name.Replace(".html","")});
}
}
if (subDirectory.Length != 0)
{
foreach (var item in subDirectory)
{
//连续迭代
node.Children.Add(GetChildren(item));
}
}
return node;
}
//绑定treeview选择响应
private void BookMarkTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeView treeView = (TreeView)sender;
Node item = (Node)treeView.SelectedItem;
//下面可以对 item 进行操作
}
二、使用用例
/* 包含原路径 */
//获取节点
DirectoryInfo directoryInfo = new DirectoryInfo("./Documents/Help/Pages");
List<Node> nodes = new List<Node>();
nodes.Add(GetChildren(directoryInfo));
//为TreeView绑定 ItemsSource
BookMarkTree.ItemsSource = nodes;
/* 只包含路径下面内容 */
DirectoryInfo directoryInfo = new DirectoryInfo("./Documents/Help/Pages");
List<Node> nodes = new List<Node>();
//处理html文件
for(int i =0;i < directoryInfo.GetFiles().Length; i++)
{
nodes.Add(new Node {Name = directoryInfo.GetFiles()[i].Name.Replace(".html", ""), Url = directoryInfo.GetFiles()[i].FullName });
}
//处理文件夹
for (int i = 0; i < directoryInfo.GetDirectories().Length; i++)
{
nodes.Add(getChildren(directoryInfo.GetDirectories()[i]));
}
//为TreeView绑定 ItemsSource
BookMarkTree.ItemsSource = nodes;