本文共 2831 字,大约阅读时间需要 9 分钟。
本篇将通过WPF4 制作简单的目录树型结构显示实例,完成本篇内容我们将作出下图所示的应用程序。
从图中我们可以看到程序主要分为两部分:左边显示本地驱动器的目录树型列表,右边显示被选中目录中的文件信息。首先,创建一个DirectoryRecord 类,通过两个泛型接口Files、Directories 分别获取文件信息和目录信息。其中使用Linq 获取目录信息时,我们只需要使用SearchOption.TopDirectoryOnly 读取当前目录文件夹信息即可,而不需使用SearchOption.AllDirectories 获取包含子文件在内的所有文件夹信息。
class DirectoryRecord{ public DirectoryInfo Info { get; set; } public IEnumerableFiles { get { return Info.GetFiles(); } } public IEnumerable Directories { get { return from di in Info.GetDirectories("*", SearchOption.TopDirectoryOnly) select new DirectoryRecord { Info = di }; } }}
在<Gird>中我们加入<TreeView> 和<DataGrid> 分别显示目录树和文件信息。在TreeView 中通过HierarchicalDataTemplate 模板显示出目录树型层级结构,DataGrid 则通过绑定TreeView 中选择的目录而显示相应文件信息。
最后,通过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{ ////// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Directory_Load(); fileInfo.AutoGeneratingColumn += fileInfoColumn_Load; } private void Directory_Load() { var directory = new ObservableCollection(); 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 requiredProperties = new List { "Name", "Length", "FullName", "IsReadOnly", "LastWriteTime" }; if (!requiredProperties.Contains(e.PropertyName)) { e.Cancel = true; } else { e.Column.Header = e.Column.Header.ToString(); } } }}
1. SearchOption Enumeration
2. Directory.GetDirectories Method
3. HierarchicalDataTemplate Class