C#-WPF系列文章
第二章 C#代码写我的电脑树形目录,显示在窗口中
提示:这是一个小功能,有需要的可以单独封装在程序中
文章目录
前言
这系列分两大类:
一个是写wpf界面ui. 也就是标签语言实现的ui美化,跟HTML编程差不多,区别在于标签和语法上有些许差别.
一个是写C#代码逻辑功能的实现
PS: 由于篇幅过长,会将某个功能模块会单独写一篇文章,方便查找
提示:以下是本篇文章正文内容,下面案例可供参考
一、新建WPF项目
此功能只是实现C#代码功能,ui美化,会在后续章节写到
二、ui页面代码
页面ui排版代码
<Window x:Class="WpfTreeView.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:WpfTreeView"
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>
1.项目中添加png磁盘的图片
2. 添加事件
3. 生成的事件, 主窗口的逻辑代码页
4.在ui设计页面鼠标右击进入 查看代码,也可以进入此窗口的C#逻辑代码页
每条语句都有注释,因为很多英文我也不是很懂,所以理解起来有点费劲,有C#基础就不难理解了
代码如下(示例):
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Controls;
namespace WpfTreeView
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
#region Constructor
/// <summary>
/// 默认构造函数
/// </summary>
public MainWindow()
{
InitializeComponent();
}
#endregion
#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);
}
}
}
5.实现的效果
由于我的电脑有5个盘,所以它会默认显示电脑上的所有磁盘
总结
可以看到,在窗口中,磁盘图标跟文件夹和文件图标是一样, 后续会继续改正