运行如下;
xaml代码;
<Window x:Class="tree1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:tree1"
mc:Ignorable="d"
Loaded="Window_Loaded"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TreeView x:Name="FolderView">
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<!--磁盘显示的图标-->
<Image Margin="3" Width="20" Source="Images/drive.png"/>
<!--功能绑定-->
<TextBlock VerticalAlignment="Center" Text="{Binding}"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
</TreeView>
</Grid>
</Window>
cs代码;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
namespace tree1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
#region On Loaded
/// <summary>
/// 绑定驱动器号
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// 获取电脑上的每个逻辑驱动器
foreach (var drive in Directory.GetLogicalDrives())
{
// 为此创建一个新项目
var item = new TreeViewItem()
{
// 设置标题
Header = drive,
// 完整路径
Tag = drive
};
// 添加一个虚拟磁盘
item.Items.Add(null);
// 监听正在扩展的文件
item.Expanded += Folder_Expanded;
// 将其添加到主树视图
FolderView.Items.Add(item);
}
}
#endregion
#region Folder Expanded
private void Folder_Expanded(object sender, RoutedEventArgs e)
{
#region Initial Checks
var item = (TreeViewItem)sender;
// 如果项目仅包含伪数据,就返回
if (item.Items.Count != 1 || item.Items[0] != null)
return;
// 清除数据
item.Items.Clear();
// 获取完整路径
var fullPath = (String)item.Tag;
#endregion
#region Get Folders
// 为目录创建一个空白列表
var directories = new List<String>();
// 尝试从文件夹中获取目录 // try异常处理,忽略出现的任何问题
try
{
var dirs = Directory.GetDirectories(fullPath);
{
if (dirs.Length > 0)
directories.AddRange(dirs);
}
}
catch { }
// 为目录做迭代,添加目录
directories.ForEach(directoryPath =>
{
// 创建目录项
var subItem = new TreeViewItem()
{
// 将标题设置为文件夹名称
Header = GetFileFolderName(directoryPath),
// 标记为完整路径
Tag = directoryPath
};
// 添加虚拟项目,以便我们可以扩展文件夹
subItem.Items.Add(null);
// 处理扩展
subItem.Expanded += Folder_Expanded;
// 将此项目添加到父项
item.Items.Add(subItem);
});
#endregion
#region Get Files
// 为目录创建一个空白文件
var Files = new List<String>();
// 尝试从文件夹中获取文件 // try异常处理,忽略出现的任何问题
try
{
var fs = Directory.GetFiles(fullPath);
{
if (fs.Length > 0)
Files.AddRange(fs);
}
}
catch { }
// 为目录做迭代,添加文件
Files.ForEach(filePath =>
{
// 创建文件
var subItem = new TreeViewItem()
{
// 将标题设置为文件名称
Header = GetFileFolderName(filePath),
// 标记为完整路径
Tag = filePath
};
// 将此项目添加到父项
item.Items.Add(subItem);
});
#endregion
}
#endregion
/// <summary>
/// 从完整路径中查找文件或文件夹名称
/// </summary>
/// <param name="path">完整路径</param>
/// <returns></returns>
public static string GetFileFolderName(string path)
{
// 如果没有路径,则返回空
if (string.IsNullOrEmpty(path))
return string.Empty;
// 使所有斜杠成反斜杠
var normalizedPath = path.Replace('/', '\\');
// 找到最后一个反斜杠就是路径
var lastIndex = normalizedPath.LastIndexOf('\\');
// 如果找不到反斜线,则返回路径本身
if (lastIndex <= 0)
return path;
// 最后一个反斜杠后返回名称
return path.Substring(lastIndex + 1);
}
}
}
原代码来自此处; 如何在C#-WPF窗口中, 添加 我的电脑 磁盘等路径 并显示相应的文件_wpf显示本地盘符_comres的博客-CSDN博客
下面大体看一下代码;
主要是在xaml中使用一个TreeView控件;在TreeView中包含资源;资源中包含Style;在Style指定绑定的目标类型TargetType是TreeViewItem;这样cs代码中给item赋值以后,FolderView.Items.Add(item) ,以及 item.Items.Add(subItem),就会把要显示的内容放到TreeView控件;
wpf中,
Setters是Style类的一个重要属性。
Setter的作用是给System.Windows.Style指定的TargetType类型或者自身的TargetName指定的对象设置属性值。
Binding是WPF 应用程序中的一种机制,它为应用程序提供了一种简单易用的方式来显示数据并与之交互。它允许数据在 UI 和业务模型之间流动。绑定完成后对业务模型中的数据所做的任何修改都会自动反映到 UI,反之亦然。绑定可以是单向的或双向的。数据绑定的源可以是普通的 .NET 属性或 Dependency 属性,但目标属性必须是Dependency属性。
在CS代码中使用Directory.GetLogicalDrives(),Directory.GetDirectories(fullPath),Directory.GetFiles(fullPath)几个System.IO的函数获取文件夹和文件的名称,然后放入item;