Skip to content

ListView虚拟模式

约 185 字小于 1 分钟

winform

2024-01-25

public partial class nocache : Form
{
    public nocache()
    {
        InitializeComponent();
        SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
    }

    private string[] imagePaths;
    private ImageList imageList = new ImageList();
    private Dictionary<int, Image> imageCache = new Dictionary<int, Image>();
    private Dictionary<int, string> pathCache = new Dictionary<int, string>();
    private void nocache_Load(object sender, EventArgs ee)
    {
        listView1.VirtualMode = true;
        listView1.View = View.LargeIcon;
        imageList.ImageSize = new Size(99, 99);
        listView1.LargeImageList = imageList;

        listView1.RetrieveVirtualItem += (s, e) =>
        {
            string str = "当前项:" + e.ItemIndex;
            if (imageCache.ContainsKey(e.ItemIndex))
            {
                str += $"取缓存的:{pathCache[e.ItemIndex]}";
                using (Image image = imageCache[e.ItemIndex])
                {
                    ListViewItem item = new ListViewItem(e.ItemIndex.ToString());
                    item.ImageIndex = e.ItemIndex;
                    e.Item = item;
                }
            }
            else
            {
                string imagePath = imagePaths[e.ItemIndex];
                str += $"新增的{e.ItemIndex} = {imagePath}";
                using (Image image = Image.FromFile(imagePath))
                {
                    ListViewItem item = new ListViewItem(e.ItemIndex.ToString());
                    item.ImageIndex = e.ItemIndex;
                    item.Text = imagePath;
                    e.Item = item;
                    imageList.Images.Add(image);
                    //imageCache[e.ItemIndex] = image;
                    imageCache.Add(e.ItemIndex, image);
                    pathCache.Add(e.ItemIndex, imagePath);
                }
            }
            Console.WriteLine(str);
        };
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string[] files = Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "img"));
        imagePaths = files.Where(t => new[] { ".png", ".jpg", ".jpge" }.Any(t.ToLower().EndsWith)).ToArray();
        this.Text = "共共共共共共共共共   " + imagePaths.Count().ToString() + " 张!";

        listView1.VirtualListSize = imagePaths.Length;
    }
}