WPF 4 目录树型显示

时间:2020-12-10 12:00:10

     本篇将通过WPF4 制作简单的目录树型结构显示实例,完成本篇内容我们将作出下图所示的应用程序。

WPF 4 目录树型显示

     从图中我们可以看到程序主要分为两部分:左边显示本地驱动器的目录树型列表,右边显示被选中目录中的文件信息。首先,创建一个DirectoryRecord 类,通过两个泛型接口Files、Directories 分别获取文件信息和目录信息。其中使用Linq 获取目录信息时,我们只需要使用SearchOption.TopDirectoryOnly 读取当前目录文件夹信息即可,而不需使用SearchOption.AllDirectories 获取包含子文件在内的所有文件夹信息。

class DirectoryRecord
{
    public DirectoryInfo Info { get; set; }

    public IEnumerable<FileInfo> Files
    {
        get
        {
            return Info.GetFiles();
        }
    }

    public IEnumerable<DirectoryRecord> Directories
    {
        get
        {
            return from di in Info.GetDirectories("*", SearchOption.TopDirectoryOnly)
                   select new DirectoryRecord { Info = di };
        }
    }
}

     在<Gird>中我们加入<TreeView> 和<DataGrid> 分别显示目录树和文件信息。在TreeView 中通过HierarchicalDataTemplate 模板显示出目录树型层级结构,DataGrid 则通过绑定TreeView 中选择的目录而显示相应文件信息。

<TreeView x:Name="directoryTreeView" Width="300" Height="387" Margin="12,12,0,0" 
          VerticalAlignment="Top" HorizontalAlignment="Left">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:DirectoryRecord}"
                                  ItemsSource="{Binding Directories}" >
            <StackPanel Orientation="Horizontal">
                <Image Source="Images/folder.png" Width="16" Height="16"/>
                <TextBlock Text="{Binding Info.Name}"/>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

<DataGrid x:Name="fileInfo" Width="548" Height="387" Margin="318,12,0,0"
          VerticalAlignment="Top" HorizontalAlignment="Left"
          GridLinesVisibility="Vertical" VerticalGridLinesBrush="Gray"
          ItemsSource="{Binding ElementName=directoryTreeView, Path=SelectedItem.Files}"/>

     最后,通过Directory_Load 方法将本地磁盘目录加载到TreeView 中,并通过定义DataGridAutoGeneratingColumnEventArgs 事件fileInfoColumn_Load 在DataGrid 中过滤出想要参考的文件信息(Name、Length、FullName、IsReadOnly、LastWriteTime)。

using System.Collections.ObjectModel;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Collections.Generic;

namespace WpfDirectoryTreeView
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Directory_Load();
            fileInfo.AutoGeneratingColumn += fileInfoColumn_Load;
        }

        private void Directory_Load()
        {
            var directory = new ObservableCollection<DirectoryRecord>();

            foreach (var drive in DriveInfo.GetDrives())
            {
                directory.Add(
                    new DirectoryRecord
                    {
                        Info = new DirectoryInfo(drive.RootDirectory.FullName)
                    }
                );
            }

            directoryTreeView.ItemsSource = directory;
        }

        private void fileInfoColumn_Load(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            List<string> requiredProperties = new List<string>
            {
                "Name", "Length", "FullName", "IsReadOnly", "LastWriteTime"
            };

            if (!requiredProperties.Contains(e.PropertyName))
            {
                e.Cancel = true;
            }
            else
            {
                e.Column.Header = e.Column.Header.ToString();
            }
        }
    }
}

参考资料

1. SearchOption Enumeration
http://msdn.microsoft.com/en-us/library/ms143448.aspx

2. Directory.GetDirectories Method
http://msdn.microsoft.com/en-us/library/c1sez4sc(v=VS.80).aspx

3. HierarchicalDataTemplate Class
http://msdn.microsoft.com/en-us/library/system.windows.hierarchicaldatatemplate.aspx

源代码下载