WPF 4 目录树型显示
本篇将通过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
源代码下载
出处:{GnieTech} (http://www.cnblogs.com/gnielee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?