【问题标题】:How to fix ListView.LargeImageList showing images twice如何修复 ListView.LargeImageList 显示图像两次
【发布时间】:2019-09-25 14:11:37
【问题描述】:

我正在开发一款软件,它可以比较 meme 并帮助用户在他们的计算机上组织 meme。作为其中的一部分,我使用Windows.Forms 来构建用户界面。此 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 是用户首次加载到文件夹时看到的示例。当用户尝试加载另一个文件夹this 时。它显示第一个文件夹中的图像,以及第二个文件夹中的图像文件的名称。

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

提前谢谢你。

【问题讨论】:

  • 你把里面的子列表清空了吗? imageList1.Images?
  • @Pramuka 是的,我已经尝试清空子列表

标签: c# winforms listview imagelist


【解决方案1】:

如果您当时想显示单个文件夹的内容,请处理 ImageList 中的对象。

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

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

索引器 (i) 总是从 0 开始,因此 ListView 项将使用您的 Imagelist 中的图像,每次都从 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 中删除:这意味着您需要从删除的 Item 之后的 Item 开始重新索引所有 ListView Items。
请记住处理从 ImageList 中删除的图像。

【讨论】:

  • 非常感谢@Jimi,我现在感觉有点傻
猜你喜欢
  • 2012-08-06
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 2019-05-30
相关资源
最近更新 更多