我想创建一个可滚动的互联网图片列表,让用户可以点击它。我如何在WinForms / C#中做到这一点?是否可以将picturebox控件/控件添加到listBox?
我尝试将一个图片框列表添加到UserControl中,并将AutoScroll设置为true,这会让我觉得使用listBox,这是一种正确的方法吗?
我还尝试将pictureBox的ImageLocation设置为图像的URI,然后调用Load()来加载图像,它确实有效,但是我的表格冻结了!如何在不冻结表格的情况下,按顺序更新每个图片框?
谢谢你, Azlam
答案 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)跟踪和使用图像加载时间的经验数据,以帮助确定需要预加载哪些单元格。