Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据需要在listview中加载缩略图?_C#_Winforms_Listview_Imagelist - Fatal编程技术网

C# 如何根据需要在listview中加载缩略图?

C# 如何根据需要在listview中加载缩略图?,c#,winforms,listview,imagelist,C#,Winforms,Listview,Imagelist,因此,我希望能够根据图像文件路径列表填充1000个缩略图。我尝试使用以下代码,但我意识到在200多个映像之后,我的程序会在System.Drawing.dll中首次抛出类型为“System.OutOfMemoryException”的异常 private void PopulateThumbnails(List<string> queryResults) { this.playerListView.Items.Clear(); this.imageList1.Imag

因此,我希望能够根据图像文件路径列表填充1000个缩略图。我尝试使用以下代码,但我意识到在200多个映像之后,我的程序会在System.Drawing.dll中首次抛出类型为“System.OutOfMemoryException”的异常

private void PopulateThumbnails(List<string> queryResults)
{
    this.playerListView.Items.Clear();
    this.imageList1.Images.Clear();
    ImageViewer imageViewer = new ImageViewer();

    foreach (string file in queryResults)
    {
        try
            this.imageList1.Images.Add(Image.FromFile(file));
        catch
            Console.WriteLine("This is not an image file");
    }

    this.ListView.View = View.LargeIcon;
    this.imageList1.ImageSize = new Size(256, 144);
    this.ListView.LargeImageList = this.imageList1;

    for (int j = 0; j < this.imageList1.Images.Count; j++)
    {
        ListViewItem item = new ListViewItem();
        item.ImageIndex = j;
        this.ListView.Items.Add(item);
    }
}
我意识到我应该只根据需要填充缩略图,但是。。。 a我如何知道listview中加载了多少项? b如何在listview中检测滚动事件?

这相当棘手

你有两个问题:

您需要知道需要显示哪些图像 您需要确保不会耗尽内存或GDI资源 不幸的是,ListView对通知您滚动或告诉您哪些项目可见的事件或属性没有帮助

下面是一段代码,它至少可以实现后者;它将数千个文件名加载到一个列表图像中,并保留100个项目的列表,最后可见:

List<string> images = new List<string>();
List<int> visibleItems = new List<int>();

void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    // this loads the images on demand:
    if (!imageList1.Images.ContainsKey(images[e.ItemIndex]) ) 
       { loadImage(e.ItemIndex); e.Item.ImageIndex = imageList1.Images.Count - 1; }
    // this makes sure the listView is drawn by the system
    e.DrawDefault = true;

    // these lines would maintain a list of items that are or were recently visible
    if (!visibleItems.Contains(e.ItemIndex)) visibleItems.Add(e.ItemIndex);
    if (visibleItems.Count > 1000)
    {
       visibleItems.Clear(); 
       imageList1.Images.Clear();
       listView1.Invalidate();
    }

}

void loadImage(int index)
{
    imageList1.Images.Add(images[index], new Bitmap(images[index]) );
}

..内存会回到起点。显示工作正常,重新加载列表时不会出现故障。。事实上,我不再使用visibleItems列表。我将其保留在答案中,因为这是了解这些项目的可行方法,但我认为没有必要使用它。

在谷歌搜索如何向ListViewItem添加缩略图或图像这里是以前的帖子,所以在此期间,我的问题是不知道如何添加缩略图。它按原样工作。当我添加了太多的缩略图时,我的问题就出现了。调试代码怎么样?也许还有一些事情你不知道。。在将项目添加到ListView后,可能需要释放此行中的项目。项目ListViewItem项目=新建ListViewItem;但我敢打赌,一旦你一步一步地浏览代码,你可能会发现一些东西。我确实调试了代码……它卡在这一行this.imageList1.Images.AddImage.FromFilefile;如果我添加了许多缩略图。如果我把名单减到100,一切都很好。问题是它的内存不足。这就是为什么我不想把它们全部画出来。this.ListView.View=View.LargeIcon;您是否认为图像的大小也可能导致问题。。您是否考虑过重新调整图像大小。。。??
imageList1.Images.Clear();