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

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

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

谢谢你,阿兹兰

有帮助吗?

解决方案

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

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

--我的2分钱...

其他提示

你介意垂直滚动吗?

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

1) 创建从 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) 创建用于绘制单元格数据的后台缓冲区位图和图形。

B) 设置 Paint() 来简单地绘制后台缓冲区,而不是执行获取图像的工作

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top