使用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
水平有限,欢迎指正批评。