目录
前言
是因是图片很多,默认的查看器不能“下一张”到另一个文件夹,又不想安装其他的图片浏览器,就决定实现一个简单一点的。
注意:这个查看器只适用于一个根目录下存在若干目录和图片,然后全部解构成一层目录,会丢失原始目录的层级关系。
1.窗体布局
2.迭代搜索和添加treeviewer节点
利用面向对象的继承特性,使用递归,查找目标目录下所有文件夹和目录,同时添加treeviewer节点。
private void browseFiles(FileSystemInfo info)
{
if (!info.Exists)
return;
DirectoryInfo dir = info as DirectoryInfo;
//不是目录
if (dir == null)
return;
FileSystemInfo[] files = dir.GetFileSystemInfos();
var rootNode = treeView1.Nodes.Add(dir.Name);
rootNode.Tag = string.Empty;
foreach(var tmp in files)
{
FileInfo file = tmp as FileInfo;
if (file != null)
{
if (!file.Name.EndsWith(".gif") &&
!file.Name.EndsWith(".jpg") &&
!file.Name.EndsWith(".png") &&
!file.Name.EndsWith(".bmp") &&
!file.Name.EndsWith(".ico")
)
return;
//加入列表
var chd = rootNode.Nodes.Add(file.Name);
chd.Tag = file.FullName;
}
else
{
browseFiles(tmp);
}
}
}
3.显示细节
1.显示模式修改
由于一些图片可能由于分辨率过大导致显示不全,所以要提供图像显示模式的修改功能。无非是修改PictureBox的PictureBoxSizeMode属性,要注意的是修改后需要刷新控件,不然显示模式还是不会更改,例如:
private void 缩放ToolStripMenuItem1_Click(object sender, EventArgs e)
{
image.SizeMode = PictureBoxSizeMode.Zoom;
image.Refresh();
}
2.实现选中节点显示对应图片
注意的是要使用level属性区分子目录与父目录(这里只有两层,很好区分);在上一步检索图片的时候,图像路径保存在Tag属性中。
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
var node = e.Node;
if (node.Level == 1) //子节点
{
String img = node.Tag.ToString();
label1.Text = img;
image.Load(img);
}
}
3.实现“下一张”、“上一张”功能
以“上一张”为例,由于目录结构只有一层,所以只要考虑在子目录和父目录两种情况就行了(感觉我的实现方法比较菜)。
“下一张”与此类似。
private void 上一张ToolStripMenuItem_Click(object sender, EventArgs e)
{
///*******************
///folder1
/// |
/// img1
/// |
/// img2
///|
///folder2
/// |
/// img2
///|
///folder3
/// |
/// img3
if (treeView1.SelectedNode == null)
return;
//获取当前选中节点
var cnode = treeView1.SelectedNode;
//如果到头了,直接返回
if (cnode.Index == 0) //已到达顶部
{
if(cnode.Parent != null) //存在父节点,说明是叶子节点
{
if (cnode.Parent.Index == 0) //父节点也到顶了
return;
//否则选中父节点的上一个兄弟节点
selectTreeNode(treeView1.Nodes[cnode.Parent.Index - 1]);
}
else
{
return;
}
}
else //未到达顶部
{
//选中上一个兄弟节点
selectTreeNode(cnode.Parent.Nodes[cnode.Index - 1]);
}
}
4.结束语
可改进的地方:
- 在递归的时候,根据相对位置,还原目录原始层级;
- 相应的,“上、下”功能也要修改,修改的点就在treeview要改成对应的父目录;
- 添加按名称搜索功能。