从网上获取图片并按顺序显示

时间:2008-11-25 18:19:20

标签: c# .net winforms user-interface c#-2.0

  1. 我想创建一个可滚动的互联网图片列表,让用户可以点击它。我如何在WinForms / C#中做到这一点?是否可以将picturebox控件/控件添加到listBox?

  2. 我尝试将一个图片框列表添加到UserControl中,并将AutoScroll设置为true,这会让我觉得使用listBox,这是一种正确的方法吗?

  3. 我还尝试将pictureBox的ImageLocation设置为图像的URI,然后调用Load()来加载图像,它确实有效,但是我的表格冻结了!如何在不冻结表格的情况下,按顺序更新每个图片框?

  4. 谢谢你, Azlam

2 个答案:

答案 0 :(得分:1)

我先回答你的第三个问题,因为这是我唯一真正知道答案的问题。图片框上有一个LoadAsync()方法,它会将图像加载到一个单独的线程中,并且不会挂起你的应用程序。

至于其他问题,我也很可能从用户控件开始并将图像放在那里。我唯一可以建议的是首先创建一个具有图片框的用户控件,可能还有一个多行文本框或旁边的richtextbox。关闭文本框上的边框,并在整个控件周围有一个小边框。这将允许您显示图像,旁边有一些文本。然后,您的实际最终控件将只是这些控件的集合,并能够根据需要添加它们。

- 我的2美分......

答案 1 :(得分:0)

你介意垂直滚动吗?

我将以DataGridView控件作为基础开始,并创建以下实现:

1)创建从DataGridViewImageColumn派生的自定义列和单元格类型。你可以称它们为“CronosNetImageColumn”,“CronosNetImageCell”。

2)创建一个类“CronosImageDetails”来保存单元格数据(包括显示文本和图像URL的属性)。这将作为每个单元格的值传入。例如:

ImageGrid.Rows.Add(new CronosImageDetails {DisplayText =“Day at the Beach”,ImageURL =“http://...beach.jpg”});

3)覆盖单元格Paint()以使用WebClient获取图像,并使用e.Graphics.DrawImage(ImageObtainedFromWebClient)将图像绘制到单元格。您可以使用e.Graphics.DrawString((CronosImageDetails)value.DisplayText,...)覆盖单元格中的文本。

这个快速解决方案可以为您提供一个滚动图像列表,只在用户滚动列表时加载图像,并为改进提供坚实的基础。

建议进一步优化:

A)创建一个后备缓冲区位图和图形,用于绘制单元格数据。

B)设置Paint()以简单地绘制后备缓冲区而不是完成工作以获取图像

C)创建一个新的单元格方法LoadImage(),它生成一个新的线程,下载图像并将其绘制到后台缓冲区。

D)使用Paint()(或单独的辅助线程)跟踪滚动的方向和加速度,并估计需要预加载哪些单元格。在这些单元格上触发LoadImage()。

E)使用加载图像初始化每个单元格的后台缓冲区。

F)跟踪和使用图像加载时间的经验数据,以帮助确定需要预加载哪些单元格。