English 中文(简体)
从互联网上获取图片并按顺序显示
原标题:
  • 时间:2008-11-25 18:19:20
  •  标签:
  1. 我想创建一个可滚动的图片列表,从互联网上获取图片,并让用户有能力单击它。如何在WinForms/C#中实现它?是否可以将pictureBox控件/控件添加到listBox中?

  2. 我尝试将一组PictureBox添加到设置为AutoScroll为true的UserControl中,这样会给我一种使用ListBox的感觉,这种方法正确吗?

  3. 我也尝试将pictureBox的ImageLocation设置为图像的URI,然后调用Load()加载图像,它确实有效,但是我的窗体却卡住了!我如何顺序更新每个pictureBox,而不会冻结我的窗体?

Thank you, Azlam

最佳回答

我先回答你的第三个问题,因为那是我真正知道答案的唯一一个问题。图片框上有一个LoadAsync()方法,可以在一个分离的线程中加载图像,不会阻塞你的应用程序。

至于其他问题,我也可能会选择使用用户控件并在其中放置图像。我唯一能建议的是,先创建一个带有图片框和可能紧挨着它的多行文本框或富文本框的用户控件。关掉文本框的边框,并在整个控件周围留有轻微的边框。这将允许您显示图像,并在其旁边添加一些文本。然后,您实际的最终控件将仅是这些控件的集合,可以随时添加它们。

我的两分钱…

问题回答

你介意垂直滚动吗?

我会以DataGridView控件为基础,创建以下实现:

创建自定义列和单元格类型,派生自DataGridViewImageColumn。您可以称它们为“CronosNetImageColumn”、“CronosNetImageCell”。

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

ImageGrid.Rows.Add(new CronosImageDetails { DisplayText="沙滩度假", ImageURL="http://...beach.jpg" });

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

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

建议进行进一步的优化:

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

将Paint()的设置更改为只需绘制后备缓冲区而不需要获取图像。

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

请用Java代码实现:利用Paint()(或单独的帮助程序线程)跟踪滚动的方向和加速度,并估计需要预加载哪些单元格。对这些单元格触发LoadImage()。

E) 将每个单元格的后备缓冲区初始化为加载图像。

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





相关问题
热门标签