如何修复 ListView.LargeImageList 显示两次图像

How to fix ListView.LargeImageList showing images twice

我正在开发一款软件,可以比较模因并帮助用户在他们的计算机上组织模因。作为其中的一部分,我正在使用 Windows.Forms 构建一个 UI。 UI 允许用户添加要检查图像的文件夹,这些图像可以与一组已知的 meme 模板进行比较。 当我尝试向用户显示找到的图像时出现了我的问题。为此,我使用 ListView 和 属性 LargeImageList 来包含图像的元组和图像文件的名称。

这是有问题的代码段:

private void button1_Click(object sender, EventArgs e)
{
    int i = 0;
    var ic = new ImageCollection();
    var fbd = new FolderBrowserDialog();
    fbd.Description = "Select meme folder or image.";
    if (fbd.ShowDialog() == DialogResult.OK)
    {
        string[] files = Directory.GetFiles(fbd.SelectedPath);
        foreach (var file in files)
        {
            if (!ic.CheckIfImage(file)) continue;
            imageList1.Images.Add(Image.FromFile(file));

        }

        foreach (var file in files)
        {
            listView1.Items.Add($"{Path.GetFileNameWithoutExtension(file)}", i++);
        }
    }
}

This is an example of what the user sees when they first load in a folder. When the user tries to load in another folder this 发生了。它显示第一个文件夹中的图像,以及第二个文件夹中图像文件的名称。

有人知道这个问题的解决方法吗?为了解决这个问题,我尝试了多种选择。从尝试清除用于包含图像的 ImageList,到尝试控制 ListView 何时更新。 None 成功了。我也尝试用谷歌搜索这个问题,但没有找到解决方法。

提前致谢。

如果你当时想显示单个文件夹的内容,那么处理掉你ImageList中的对象。

如果您想显示多个文件夹的内容,您需要指定添加图片的新索引。您改为使用相同的索引引用在 ListView 中添加一个新项目:

int i = 0;
//(...)
listView1.Items.Add($"{Path.GetFileNameWithoutExtension(file)}", i++); 

索引器 (i) 总是从 0 开始,因此 ListView Item 每次都会使用图像列表中从 Index[0] 处的图像开始的图像。永远不会显示新图像。

您可以使用 ImageList.Images.Count 值(表示已添加到 ImageList 的图像数)作为基础并从该值开始递增索引器:

private void button1_Click(object sender, EventArgs e)
{
    int i = imageList1.Images.Count;
    var ic = new ImageCollection();
    var fbd = new FolderBrowserDialog();
    fbd.Description = "Select meme folder or image.";
    if (fbd.ShowDialog() == DialogResult.OK)
    {
        foreach (var file in Directory.GetFiles(fbd.SelectedPath))
        {
            if (!ic.CheckIfImage(file)) continue;
            imageList1.Images.Add(new Bitmap(file, true));
            listView1.Items.Add($"{Path.GetFileNameWithoutExtension(file)}", i++);
        }
    }
}

如果您允许从 ListView 中删除一个图像,您也应该从 ImageList 中删除它:这意味着您需要 re-index 从被删除的项目之后的项目开始的所有 ListView 项目。
请记住处理从 ImageList 中删除的图像。