WinForm版ListView图片查看小程序(用ListView显示某个文件夹中图片为缩略图,PictureBox显示大图)

这个问题是在百度上看到的:


为了解决这个问题看了花了大半天的时间啊,毕竟对ListView的一些基本操作不熟悉,做这个算是第一次近距离观察ListView了。
解决方案不一定很完美,但是我是花了一番心思的,折腾了好半天才弄正常,仅仅是对ListView的摸索、学习。
下面的代码中会有一些问题,比如文件的存在没有判断、一些小细节忽略了。有些注释是在写博客的时候添加的,可能格式不是很好。
下面是一些总结,或者算是笔记吧。

1.OpenFileDialog的基本设置
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Multiselect = true;//设置 选择多个文件

            ofd.InitialDirectory = @"G:\images\";//设置初始目录  TODO:改为系统默认我的文档中的图片文件夹

            ofd.Multiselect = true;

            //ofd.Filter = "JPG(*.jpg)|*.jpg|JPEG(*.jpeg)|*.jpeg|PNG(*.png)|*.png|GIF(*.gif)|*.gif|所有文件(*.*)|*.*";

            ofd.Filter = "图片文件(*.jpg *.jpeg *.gif *.png)|*.jpg;*.jpeg;*.gif;*.png";

2.ImageList的一些操作

        private ImageList GetImage(string[] files)//这个函数通过传入文件的路径的数组,获取图片到ImageList

        {

            ImageList list = new ImageList();

            for (int i = 0; i < files.Length; i++)

            { 

                list.Images.Add(files[i], Image.FromFile(files[i]));//用Image.FromFile()函数直接获取图片文件到生成Image对象,然后添加到list.Images里面

                                                                    //注意这儿将图片的路径作为Key传到第一个参数,方便后面取出使用

                list.ImageSize = new Size(60, 80);

                //这个地方可是折腾我老半天的,以为可以在后面再设置缩略图的大小的,所以这儿最初没有设置,结果到后面设置起不了作用,得到的缩略图都是极其模糊                //的,后面附上没有这一句的效果图,list.ImageSize = new Size(60, 80);

            }

            return list;

        }

WinForm版ListView图片查看小程序(用ListView显示某个文件夹中图片为缩略图,PictureBox显示大图)

3.对ListView的一些操作
listView1.LargeImageList.Images.Add(list.Images.Keys[i], list.Images[i]);

//这里就用到了上面说的作为key存储到ImageList.Images里的路径
if (!listView1.Items.ContainsKey(files[index]))

//添加图片前的判断,判断是否已经在列表里存在当前的文件了,用的是前面传进来的图片路径

listView1.View = View.LargeIcon;//设置ListView的View属性为LargeIcon

listView1.MultiSelect = false;//点击选择时 只能选择一个图片

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)//点击图片时  在ListView的SelectedIndexChanged事件  切换图片

        {

            if (listView1.SelectedItems.Count == 1)

            {

                pictureBox1.Image = Image.FromFile(listView1.SelectedItems[0].Name);//这里的要点是listView1.SelectedItems[0].Name,又是路径,找了半天才找                                                                                     //到用的是Name属性,以为应该是Key属性,可是没有找打

                //MessageBox.Show(listView1.SelectedItems[0].Name);

            }

        }
附上完整代码:
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;



namespace ListView2图片副本

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }



        private void button1_Click(object sender, EventArgs e)

        {

            //MessageBox.Show((GetImages() == null).ToString());

            listView1.View = View.LargeIcon;

            listView1.MultiSelect = false;



            string[] files = GetImages();

            if (files != null)

            {

                ImageList list = GetImage(files);

                if (listView1.LargeImageList == null)

                {

                    listView1.LargeImageList = new ImageList();

                    listView1.LargeImageList.ImageSize = new Size(60, 80);

                }

                for (int i = 0; i < list.Images.Count; i++)

                {

                    listView1.LargeImageList.Images.Add(list.Images.Keys[i], list.Images[i]);

                }



                int count = listView1.Items.Count;

                if (files.Length == list.Images.Count)

                {

                    for (int i = count; i < count + files.Length; i++)

                    {

                        int index = i - count;

                        FileInfo info = new FileInfo(files[index]);

                        //ListViewItem item = new ListViewItem(info.Name, i);

                        //item.Name = info.FullName;



                        if (!listView1.Items.ContainsKey(files[index]))

                        {

                            listView1.Items.Add(files[index], info.Name, i);

                        }

                        else

                        {

                            //listView1.LargeImageList.Images.RemoveByKey(files[index]);//用不着这一句

                            MessageBox.Show("已存在此图片:" + files[index] + ",不能重复添加!");

                        }

                    }

                    //listView1.LargeImageList = list;

                }

            }

        }



        private ImageList GetImage(string[] files)

        {

            ImageList list = new ImageList();

            for (int i = 0; i < files.Length; i++)

            {

                //Image image = Image.FromFile(files[i]);

                list.Images.Add(files[i], Image.FromFile(files[i]));

                list.ImageSize = new Size(60, 80);

            }

            return list;

        }



        private string[] GetImages()

        {

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Multiselect = true;//设置 选择多个文件

            ofd.InitialDirectory = @"G:\images\";//设置初始目录  TODO:改为系统默认我的文档中的图片文件夹

            ofd.Multiselect = true;

            //ofd.Filter = "JPG(*.jpg)|*.jpg|JPEG(*.jpeg)|*.jpeg|PNG(*.png)|*.png|GIF(*.gif)|*.gif|所有文件(*.*)|*.*";

            ofd.Filter = "图片文件(*.jpg *.jpeg *.gif *.png)|*.jpg;*.jpeg;*.gif;*.png";

            if (ofd.ShowDialog() == DialogResult.OK && ofd.FileNames != null)

            {

                string[] files = ofd.FileNames;

                return files;

            }

            else

            {

                return null;

            }

        }



        private void listView1_SelectedIndexChanged(object sender, EventArgs e)

        {

            if (listView1.SelectedItems.Count == 1)

            {

                pictureBox1.Image = Image.FromFile(listView1.SelectedItems[0].Name);

                //MessageBox.Show(listView1.SelectedItems[0].Name);

            }

        }

    }

}

附上截图:
WinForm版ListView图片查看小程序(用ListView显示某个文件夹中图片为缩略图,PictureBox显示大图)

点击 这里下载源码

最新修改的地方(2012-07-01 18:00)
#原来的代码没有判断图片的大小,显示小图片时会被放大而变得很模糊,加上判断后调整PictureBox的SizeMode
        private void listView1_SelectedIndexChanged(object sender, EventArgs e)

        {

            if (listView1.SelectedItems.Count == 1)

            {

                //MessageBox.Show(listView1.SelectedItems[0].Name);

                //pictureBox1.Image = Image.FromFile(listView1.SelectedItems[0].Name);

                Image image = Image.FromFile(listView1.SelectedItems[0].Name);

                if (image.Width > pictureBox1.Width || image.Height > pictureBox1.Height)

                {

                    pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;

                }

                else

                {

                    pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

                }

                pictureBox1.Image = image;

            }

        }

你可能感兴趣的:(ListView)