如何在C#-WPF窗口中, 添加 我的电脑 磁盘等路径 并显示相应的文件

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个盘,所以它会默认显示电脑上的所有磁盘

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

可以看到,在窗口中,磁盘图标跟文件夹和文件图标是一样, 后续会继续改正

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值