如题,我有一个自定义flowlayoutpanel控件,上面动态添加picturebox控件来显示图片,我用的是pic控件的异步加载图片方式
一下为基本代码,当我选择一些图片的时候它已经加载到flowlayoutpanel控件上了,但是pic不显示图片,在显示全部图片的时候还闪烁一下,我想实现的是当加载一张图片pic就显示这张图,并且不显示,求高手解答,另外我已经设置doublebuffered的属性以及任何可能导致闪烁的属性了private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
ofd.Filter = "(*.jpg,*.gif,*.jpeg)|*.jpg;*.gif;*.jpeg|*.jpg|*.jpg|*.gif|*.gif|*.jpeg|*.jpeg";
ofd.FilterIndex = 1;
if (ofd.ShowDialog() == DialogResult.OK)
{
//scaner.FilePath = ofd.FileName;
for (int i = 0; i < ofd.FileNames.Length; i++)
{
FileInfo fi = new FileInfo(ofd.FileNames[i]);
fi.CopyTo(scaner.FilePath + "\\" + fi.Name,true);
Thread.Sleep(500);
object url = scaner.FilePath + "\\" + fi.Name;
Thread th = new Thread(new ParameterizedThreadStart(imgList.AddImage));
th.Start(url);
//imgList.AddImage(scaner.FilePath + "\\" + fi.Name);
Thread.Sleep(500);
}
}
}/// <summary>
/// 添加
/// </summary>
/// <param name="path">图片路径</param>
public void AddImage(string path)
{
PictureBox pb = new PictureBox();
CheckBox cb = new CheckBox(); pb.AllowDrop = true;
pb.Name = this.Controls.Count.ToString(); byte[] image = SetImageToByteArray(path);
Image img = SetByteToImage(image); pb.Image = ResizeImage(img, 100, 150); //pb.Image = Image.FromFile(path);
//pb.WaitOnLoad = false;
//pb.LoadAsync(path); pb.Tag = path;
pb.Size = new Size(picWidth, picHeight);
pb.SizeMode = PictureBoxSizeMode.StretchImage;
pb.BorderStyle = BorderStyle.FixedSingle;
pb.MouseDown += new MouseEventHandler(Pic_MouseDown);
pb.DragDrop += new DragEventHandler(Pic_DragDrop);
pb.DragEnter += new DragEventHandler(Pic_DragEnter);
pb.MouseEnter+=new EventHandler(pb_MouseEnter);
pb.MouseUp+=new MouseEventHandler(pb_MouseUp); PictureBox pbDel = new PictureBox();
pbDel.Tag = pb;
pbDel.Size = new Size(15, 15);
pbDel.Image = deleteImage;
pbDel.Location = new Point(0, pb.Height - pbDel.Height);
pbDel.BackColor = Color.Transparent;
pbDel.Click += new EventHandler(PicDel_Click); cb.Name = this.Controls.Count.ToString();
cb.Tag = path;
cb.Size = new Size(15, 15);
cb.Location = new Point(pb.Width - 15, pb.Height - cb.Height);
cb.Click+=new EventHandler(cb_Click); CheckForIllegalCrossThreadCalls = false;
pb.Controls.Add(cb);
pb.Controls.Add(pbDel);
this.Controls.Add(pb);
}
一下为基本代码,当我选择一些图片的时候它已经加载到flowlayoutpanel控件上了,但是pic不显示图片,在显示全部图片的时候还闪烁一下,我想实现的是当加载一张图片pic就显示这张图,并且不显示,求高手解答,另外我已经设置doublebuffered的属性以及任何可能导致闪烁的属性了private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = true;
ofd.Filter = "(*.jpg,*.gif,*.jpeg)|*.jpg;*.gif;*.jpeg|*.jpg|*.jpg|*.gif|*.gif|*.jpeg|*.jpeg";
ofd.FilterIndex = 1;
if (ofd.ShowDialog() == DialogResult.OK)
{
//scaner.FilePath = ofd.FileName;
for (int i = 0; i < ofd.FileNames.Length; i++)
{
FileInfo fi = new FileInfo(ofd.FileNames[i]);
fi.CopyTo(scaner.FilePath + "\\" + fi.Name,true);
Thread.Sleep(500);
object url = scaner.FilePath + "\\" + fi.Name;
Thread th = new Thread(new ParameterizedThreadStart(imgList.AddImage));
th.Start(url);
//imgList.AddImage(scaner.FilePath + "\\" + fi.Name);
Thread.Sleep(500);
}
}
}/// <summary>
/// 添加
/// </summary>
/// <param name="path">图片路径</param>
public void AddImage(string path)
{
PictureBox pb = new PictureBox();
CheckBox cb = new CheckBox(); pb.AllowDrop = true;
pb.Name = this.Controls.Count.ToString(); byte[] image = SetImageToByteArray(path);
Image img = SetByteToImage(image); pb.Image = ResizeImage(img, 100, 150); //pb.Image = Image.FromFile(path);
//pb.WaitOnLoad = false;
//pb.LoadAsync(path); pb.Tag = path;
pb.Size = new Size(picWidth, picHeight);
pb.SizeMode = PictureBoxSizeMode.StretchImage;
pb.BorderStyle = BorderStyle.FixedSingle;
pb.MouseDown += new MouseEventHandler(Pic_MouseDown);
pb.DragDrop += new DragEventHandler(Pic_DragDrop);
pb.DragEnter += new DragEventHandler(Pic_DragEnter);
pb.MouseEnter+=new EventHandler(pb_MouseEnter);
pb.MouseUp+=new MouseEventHandler(pb_MouseUp); PictureBox pbDel = new PictureBox();
pbDel.Tag = pb;
pbDel.Size = new Size(15, 15);
pbDel.Image = deleteImage;
pbDel.Location = new Point(0, pb.Height - pbDel.Height);
pbDel.BackColor = Color.Transparent;
pbDel.Click += new EventHandler(PicDel_Click); cb.Name = this.Controls.Count.ToString();
cb.Tag = path;
cb.Size = new Size(15, 15);
cb.Location = new Point(pb.Width - 15, pb.Height - cb.Height);
cb.Click+=new EventHandler(cb_Click); CheckForIllegalCrossThreadCalls = false;
pb.Controls.Add(cb);
pb.Controls.Add(pbDel);
this.Controls.Add(pb);
}
解决方案 »
- c# 何如在窗体内部 运行另外一个程序呢?
- access数据库 insert into 语法错误 ,在线等啊
- 很菜的問題,不要笑啊~
- ,.net应用程序每次运行时都提示The application failed to initialize properly (0x000007b).....
- 在线结账: 上传文件/把名称写入到数据据,这样写对吗?
- 100分,在线等,c#的程序安装问题 !
- UDP传输文件源码纠错
- wpf datagrid 编辑某一行后 保存
- 怎样在禁止axWebBrowser中页面或者button的超链接打开新窗口(请教~!)
- 高分相求vs.net 2003的下载地址
- 请问,C#某一类型控件,获得焦点,用中文输入法输入"国“,如何得到这个字符,谢谢
- 求教C#和C++的socket通讯中结构体中存在字符串的问题
如果是继承的FlowLayoutPanel就在初始化的时候加;
SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
要不然就要加在窗体初始化的时候;
另外,每加一个图片执行一次
this.Refresh();
要实现异步图片加载。
要实现异步图片加载。
我用的是 picturebox控件自带的异步加载方法都不好用
要实现异步图片加载。
我用的是 picturebox控件自带的异步加载方法都不好用
this.Controls.Add(pb);
我以前用VB.Net做过类似的西,
好像这个地方要用委托来做;
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
2.CheckForIllegalCrossThreadCalls = false;这个也不要把这东西放到线程的方法里,在窗体的构造函数里操作就是了。如果要在所有线程执行完后。那就把他放到for的外边去。
3。你在for循环内加Thread.Sleep(500)。相当于把主UI线程给睡了500,当然UI不干活了。