如何修复 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 中删除的图像。
我正在开发一款软件,可以比较模因并帮助用户在他们的计算机上组织模因。作为其中的一部分,我正在使用 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 中删除的图像。