WPF实现简单的文件浏览界面

时间:2025-03-14 08:47:50

    使用WPF编写文件浏览界面,做的比较简单。因为没有找到合适的第三方库,所以自己手动写一个简单的先试试。没有使用XAML,纯C#代码实现。主要使用的控件Grid, TreeView, ListView,GridSplitter。

    使用了两个简单的文件夹图标,使用了Binding,(这个我也不是特别熟,但是勉强用上了),编写了几个简单的类。参考了网上的一些资料和书籍,先总结如下:

    01、ImagedTreeViewItem类,继承自TreeViewItem

using System;
using ;
using ;
using ;
using ;

namespace LocalFileManager
{
    /// <summary>
    /// 简单的Item类,选中和不被选中用两种图标表示
    /// 内置一个StackPanel,包括一个TextBlock显示文本,图片
    /// </summary>
    public class ImagedTreeViewItem : TreeViewItem
    {
        TextBlock text;
        Image img;
        ImageSource srcSelected, srcUnselected;

        /// <summary>
        /// Constructor makes stack with image and text
        /// </summary>
        public ImagedTreeViewItem()
        {
            StackPanel stack = new StackPanel();
             = ;
            Header = stack;

            img = new Image();
             = ;
             = new Thickness(0, 0, 2, 0);
            (img);

            text = new TextBlock();
             = ;
            (text);
        }

        /// <summary>
        /// Public porperty for text and images
        /// </summary>
        public string Text
        {
            get { return ; }
            set {  = value; }
        }

        public ImageSource SelectedImage
        {
            get { return srcSelected; }
            set
            {
                srcSelected = value;

                if(IsSelected)
                {
                     = srcSelected;
                }
            }//end of set
        }//end of public Imagesource SelectedItem

        public ImageSource UnselectedImage
        {
            get { return srcUnselected; }
            set
            {
                srcUnselected = value;
                if(!IsSelected)
                {
                     = srcUnselected;
                }
            }//end of set
        }//end of public ImageSource UnselectedImage

        /// <summary>
        /// Event override to set image
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSelected(RoutedEventArgs e)
        {
            (e);
             = srcSelected;
        }

        protected override void OnUnselected(RoutedEventArgs e)
        {
            (e);
             = srcUnselected;
        }
    }
}

    02、文件夹列表item,继承自ImagedTreeViewItem

using System;
using ;
using ;
using ;
using ;
using ;
using ;

namespace LocalFileManager
{
    /// <summary>
    /// 文件夹列表item,继承自ImagedTreeViewItem
    /// </summary>
    public class DirectoryTreeViewItem : ImagedTreeViewItem
    {
        DirectoryInfo dir;

        //Constructor requires DirectoryInfo object
        public DirectoryTreeViewItem(DirectoryInfo pDir)
        {
             = pDir;
            Text = ;

            SelectedImage = new BitmapImage(new Uri("pack://application:,,/img/"));
            UnselectedImage = new BitmapImage(new Uri("pack://application:,,/img/"));
        }

        /// <summary>
        /// public property to obtain DirectoryInfo
        /// </summary>
        public DirectoryInfo DirInfo
        {
            get { return dir; }
        }

        /// <summary>
        /// public mathod to populate wtih items
        /// </summary>
        public void Populate()
        {
            DirectoryInfo[] dirs;

            try
            {
                dirs = ();
            }
            catch
            {
                return;
            }

            foreach(DirectoryInfo dirChild in dirs)
            {
                (new DirectoryTreeViewItem(dirChild));
            }
        }

        /// <summary>
        /// event override to populate subitem
        /// </summary>
        /// <param name="e"></param>
        protected override void OnExpanded(RoutedEventArgs e)
        {
            (e);

            foreach(object obj in Items)
            {
                DirectoryTreeViewItem item = obj as DirectoryTreeViewItem;
                ();
            }
        }
    }
}

    03、路径树,继承自TreeView

using System;
using ;
using ;
using ;
using ;
using ;
using ;

namespace LocalFileManager
{
    /// <summary>
    /// 路径树,继承自TreeView
    /// </summary>
    public class DirectoryTreeView : TreeView
    {
        /// <summary>
        /// Constructor builds
        /// </summary>
        public DirectoryTreeView()
        {
            RefreshTree();
        }

        public void RefreshTree()
        {
            BeginInit();
            ();

            //Obtain the disk drivers
            DriveInfo[] drivers = ();

            foreach(DriveInfo drive in drivers)
            {
                char chDrive = ()[0];
                DirectoryTreeViewItem item = new DirectoryTreeViewItem();

                //display ...
                if(chDrive != 'A' && chDrive != 'B' &&  &&  > 0)
                {
                     = ("{0}  ({1})", , );
                }
                else
                {
                     = ("{0}  ({1})", , );
                }

                (item);

                if(chDrive != 'A' && chDrive != 'B' && )
                {
                    ();
                }
            }

            EndInit();
        }
    }
}

    04、文件信息类,自定义了几个需要显示的文件的属性

using System;
using ;
using ;
using ;
using ;

namespace LocalFileManager
{
    /// <summary>
    /// 自定义的文件信息类,用于绑定到ListViewItem中
    /// </summary>
    public class FileInfoDemo
    {
        string strFileName;
        string strFileType;
        string strFileSize;
        string _lastModifyTime;
        string _filePath;

        /// <summary>
        /// 文件名
        /// </summary>
        public string FileName
        {
            get { return strFileName; }
            set { strFileName = value; }
        }

        /// <summary>
        /// 文件类型
        /// </summary>
        public string FileType
        {
            get { return strFileType; }
            set { strFileType = value; }
        }

        /// <summary>
        /// 文件大小
        /// </summary>
        public string Size
        {
            get { return strFileSize; }
            set { strFileSize = value; }
        }

        /// <summary>
        /// 最后一次修改时间
        /// </summary>
        public string LastModifyTime
        {
            get { return _lastModifyTime; }
            set { _lastModifyTime = value; }
        }

        /// <summary>
        /// 文件所在路径
        /// </summary>
        public string FilePath
        {
            get { return _filePath; }
            set { _filePath = value; }
        }
    }
}

    05、主界面

 ListView lvFileInfo = new ListView();
        public LocalFileManager()
        {
            Title = "LocalFileManager";

            //网格布局
            Grid grid = new Grid();
            Content = grid;

            //定义3列
            ColumnDefinition coldef = new ColumnDefinition();
             = new GridLength(50, );
            (coldef);

            coldef = new ColumnDefinition();
             = ;
            (coldef);

            coldef = new ColumnDefinition();
             = new GridLength(50, );
            (coldef);

            //定义文件夹树
            DirectoryTreeView mainTree = new DirectoryTreeView();
             += MainTree_SelectedItemChanged;
            (mainTree);
            (mainTree, 0);

            //分隔条
            GridSplitter splite = new GridSplitter();
             = 6;
             = ;
            (splite);
            (splite, 1);

            //全局ListView
            lvFileInfo = new ListView();
            (lvFileInfo);
            (lvFileInfo, 2);


            //定义字段,绑定到文件信息类中
            GridView myview = new GridView();
             = myview;
            GridViewColumn mycolun = new GridViewColumn();
             = "文件名";
             = 80;
             = new Binding("FileName");
            (mycolun);

            mycolun = new GridViewColumn();
             = "类型";
             = 80;
             = new Binding("FileType");
            (mycolun);

            mycolun = new GridViewColumn();
             = "大小";
             = 80;
             = new Binding("Size");
            (mycolun);

            mycolun = new GridViewColumn();
             = "最后修改";
             = 80;
             = new Binding("LastModifyTime");
            (mycolun);

            mycolun = new GridViewColumn();
             = "路径";
             = 80;
             = new Binding("FilePath");
            (mycolun);

            //右键菜单添加测试
            ContextMenu myContext = new ContextMenu();

            MenuItem myMUItem = new MenuItem();
             = "下载";
             = "Menu01";
            (myMUItem);

            myMUItem = new MenuItem();
             = "查看";
             = "FileLook";
             += FileLook_Click;
            (myMUItem);

            myMUItem = new MenuItem();
             = "刷新";
             = "Menu03";
            (myMUItem);

            myMUItem = new MenuItem();
             = "重命名";
             = "Menu04";
            (myMUItem);

            myMUItem = new MenuItem();
             = "新建文件夹";
             = "Menu05";
            (myMUItem);

             = myContext;

        }

    06、当文件夹选择改变时,调用事件查找选择的文件夹下的文件,并显示到ListView中

 /// <summary>
        /// 文件夹树改变时,查找文件夹下是否存在文件,如果存在,则显示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            DirectoryTreeViewItem item =  as DirectoryTreeViewItem;

            //();
            ();

            FileInfo[] fileInfos;

            try
            {
                fileInfos = ();
            }
            catch
            {
                return;
            }

            foreach(FileInfo info in fileInfos)
            {
                FileInfoDemo myFile = new FileInfoDemo();
                 = ;
                 = ();
                 = ();
                 = ;
                 = ;

                (myFile);
            }
        }

    完成代码请见:/download/kakaluote81/10418964

    水平有限,欢迎指正批评。