因为工作需要,想用c# winform做一个管理图片的软件,其中遇到panel在添加控件后不能完全显示的问题,思路是把指定路径下的图片全部加载进一个数组里,然后循环数组并new一个新的picturebox来显示图片,每个picturebox的size设置在500*500,可当图片数量超过一定数量后便显示不了。请教各位有什么方法可以突破?或是我的思路这样对不对?
string path = @"D:\图片";
Image[] images;
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < images.Length; i++)
{
PictureBox pic = new PictureBox();
int x, y, row;
row = panel1.Width / pic.Width;
float space = (panel1.Width - (pic.Width * row)) / (row + 1);
x = i % row;
y = i / row;
pic.Text = i.ToString();
pic.Size = new Size(500, 500);
pic.BackgroundImage = images[i];
pic.BackgroundImageLayout = ImageLayout.Stretch;
pic.Location = new Point((int)(pic.Width + space) * x, (int)(pic.Height + space) * y);
try
{
panel1.Controls.Add(pic);
}
catch
{
return;
}
Application.DoEvents();
}
}
这个路径下有大约850张图片运行后,只能显示出240多张左右滚动条就到底了。不能继续往下滑了也不显示。缩小picturebox的size后显示的数量会增多,放大picturebox的size后则显示更少数量。
Application.DoEvents();这句也是在网上找的,但问题依然不能解决。
另外还有一个思路就是 如果可以做到像网页浏览一样,边下滑边加载的方法,这样可以避免加载时间过长,也没找到方法和思路,因为我对编程属于兴趣爱好,没事可以边学边做的,还有很多不懂,希望可以得到大家的指导,最好可以给出代码进行参考。
winform和webform不一样,
webform是流式布局,它可以一直往下拉,没有高度限制
而winform是基于窗体的,本质上其实就是基于像素的
它不可能无限大,否则这些信息存哪,内存爆炸
它是有个分辨率上限的
上限就是int32类型的上限,超过这个就无法显示
可以换一下实现思路,picturebox是用来显示图片显示的;你目前是是一张图片new 一个picturebox对象,这本身就会占用量资源。
额,
example:把图片比做人,picturebox比做厕所,内存资源比作地,你目前的方式是每个人要上厕所都给修一个厕所,那1W个人不得修1W个厕所了?,那有那麽多地修厕所。所以公共厕所就出来了,修10个,100个厕所,要上厕所的进去,上完了就出来。
你可以模拟一个流的过程,往下滑时,前面的图像移出picturebox,后面的图像添加进去。
当然,你为啥不用ImageList控件呢