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

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 };
}
}
}
http://11011.net/software/vspaste 在<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}"/>
http://11011.net/software/vspaste 最后,通过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();
}
}
}
}
http://11011.net/software/vspaste 参考资料
1. SearchOption Enumeration
http://msdn.microsoft.com/en-us/library/ms143448.aspx2. Directory.GetDirectories Method
http://msdn.microsoft.com/en-us/library/c1sez4sc(v=VS.80).aspx3. HierarchicalDataTemplate Class
http://msdn.microsoft.com/en-us/library/system.windows.hierarchicaldatatemplate.aspx