我有以下代码:

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            pixelscoordinatesinrectangle = new List<Point>();
            pixelscoordinatesinrectangle = pointsAffected.ToList();
            DrawIt = false;
            for (int i = 0; i < trackBar1FileInfo.Length; i++)
            {
                DrawIt = true;
                trackBar1.Value = i;
                LoadPictureAt(trackBar1.Value, sender);
                pictureBox1.Refresh();
                pixelscoordinatesinrectangle = pointsAffected.ToList();
                MessageBox.Show(pixelscoordinatesinrectangle.Count.ToString());
            }
        }


trackBar1FileInfo is FileInfo[]并在其中包含5006个文件,例如

index 0 I see test.gif
index 1 I see test1.gif
index 2 test2.gif
and so on....


在trackBar1滚动事件中,当我左右移动trackBar时,它正在更改pictureBox1中的图像。

LoadPictureAt是:

private bool LoadPictureAt(int nIndex, object c)
        {

            {
                bool bRet = false;

                if (nIndex >= 0 && nIndex < trackBar1FileInfo.Length)
                {
                    if (c.Equals(trackBar1))


                        pictureBox1.Load(trackBar1FileInfo[nIndex].FullName);
                    bRet = true;

                }
                if (bitmaps != null)
                {
                    if (nIndex >= 0 && nIndex < bitmaps.Length)
                    {
                        if (c.Equals(trackBar2))
                            pictureBox1.Image = bitmaps[nIndex];
                        bRet = true;
                    }
                }
                return bRet;

            }
        }


我在trackBar1滚动事件中使用方法LoadPictureAt来显示图像。

pixelscoordinatesinrectangle是列表

在绘画活动中,我有:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (cloudPoints != null)
            {
                if (DrawIt)
                {
                    e.Graphics.DrawRectangle(pen, rect);
                    pointsAffected = cloudPoints.Where(pt => rect.Contains(pt));

                    CloudEnteringAlert.pointtocolorinrectangle = pointsAffected.ToList();
                    Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, PixelFormat.Format32bppArgb);
                    CloudEnteringAlert.Paint(e.Graphics, 1, 200, bmp);
                }
            }
        }


问题是:


pictureBox1中的图像在执行循环时不会更改。
列表pixelscoordinatesinrectangle如果是203个项目,则永远不会更改,它将保留203个项目。


这里的想法是循环遍历所有图像并更新pictureBox1并执行绘制事件代码,因此每次每张图像List pixelscoordinatesinrectangle也会更新。

现在发生的是只有trackBar1移到0,然后一个一个地上移。其他所有不变。

最佳答案

循环在主UI上阻塞。使用单独的线程/后台工作者进行更新。在这里看看,可能重复:Creating a statusfield for users

08-16 11:20