本篇将通过WPF4 制作简单的目录树型结构显示实例,完成本篇内容我们将作出下图所示的应用程序。
从图中我们可以看到程序主要分为两部分:左边显示本地驱动器的目录树型列表,右边显示被选中目录中的文件信息。首先,创建一个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