c# – 从wpf文件路径列表中填充树状视图

有几个例子说明如何从诸如thisthis other等文件路径的集合中填充树视图。我似乎找不到WPF这样的例子。我知道我可以整合Windows窗体,并使用不同的控件,以使其工作,但如果我可以使用wpf treeview控件做同样的事情将是很好的。我想要构造的树视图包含大约50,000个文件,因此我认为如果它绑定到某个东西会更好。但是在绑定之前,我认为根据字符串列表(字符串包含文件的路径)构建一个是有帮助的。
我对这个问题很感兴趣,一起投掷。作为第一次通过,我认为我非常接近你正在寻找的。谈论约5万件商品,但我认为懒惰加载可能是适当的。无论如何,这里是基于Josh Smith的article的简单版本。我把所有的代码放在这里,但是魔术真的发生在数据模板上。

给出几个类来表示我们正在使用的对象

using System.Collections.Generic;

namespace WpfTreeViewBinding.Model
{
    public class Item
    {
        public string Name { get; set; }
        public string Path { get; set; }
    }
}

和…

namespace WpfTreeViewBinding.Model
{
    public class FileItem : Item
    {

    }
}

和…

namespace WpfTreeViewBinding.Model
{
    public class DirectoryItem : Item
    {
        public List<Item> Items { get; set; }

        public DirectoryItem()
        {
            Items = new List<Item>();
        }
    }
}

我创建了一个递归方法来加载一些目录/文件…

using System.Collections.Generic;
using System.IO;
using WpfTreeViewBinding.Model;

namespace WpfTreeViewBinding
{
    public class ItemProvider
    {
        public List<Item> GetItems(string path)
        {
            var items = new List<Item>();

            var dirInfo = new DirectoryInfo(path);

            foreach(var directory in dirInfo.GetDirectories())
            {
                var item = new DirectoryItem
                               {
                                   Name = directory.Name,
                                   Path = directory.FullName,
                                   Items = GetItems(directory.FullName)
                               };

                items.Add(item);
            }

            foreach(var file in dirInfo.GetFiles())
            {
                var item = new FileItem
                               {
                                   Name = file.Name, 
                                   Path = file.FullName
                               };

                items.Add(item);
            }

            return items;
        }
    }
}

从那里只是获取数据的一个问题…

using System.Windows;

namespace WpfTreeViewBinding
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var itemProvider = new ItemProvider();

            var items = itemProvider.GetItems("C:\\Temp");

            DataContext = items;
        }
    }
}

并显示它…

<Window x:Class="WpfTreeViewBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:Model="clr-namespace:WpfTreeViewBinding.Model" 
        Title="MainWindow" 
        Height="350" Width="525">

    <Window.Resources>

        <HierarchicalDataTemplate DataType="{x:Type Model:DirectoryItem}"
                                  ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" />
        </HierarchicalDataTemplate>

        <DataTemplate DataType="{x:Type Model:FileItem}">
            <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" />
        </DataTemplate>

    </Window.Resources>

    <Grid Margin="8">
        <TreeView ItemsSource="{Binding}" />
    </Grid>

</Window>

所有的魔法真的发生在数据模板上。我估计整个事情的关键是对层次结构(即目录)的任何项目使用HierarchicalDataTemplate。

注1:我还没有广泛地测试过这个。它没有被表现出来。我会欢迎任何反馈,因为这是一个问题我试图解决很久以前放弃了。谢谢!

注2:您需要将硬编码的路径设置为在系统上有意义的路径。

这是一个屏幕截图,显示不同级别的目录和文件…

http://stackoverflow.com/questions/6415037/populate-treeview-from-list-of-file-paths-in-wpf

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 从wpf文件路径列表中填充树状视图