原文: 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