标签文本没有';直到整个循环完成,才能更新
本文关键字:循环 更新 文本 标签 | 更新日期: 2023-09-27 17:58:29
我有一个Winform程序,当用户单击按钮时,它会进行一些计算,然后调用picturebox绘制事件,根据计算结果绘制新的BMP。这很好用。
现在我想这样做100次,每次图片框刷新时,我都想通过更新标签上的文本来查看它当前的迭代,如下所示:
private void button2_Click(object sender, EventArgs e)
{
for (int iterations = 1; iterations <= 100; iterations++)
{
// do some calculations to change the cellmap parameters
cellMap.Calculate();
// Refresh picturebox1
pictureBox1.Invalidate();
pictureBox1.Update();
// Update label with the current iteration number
label1.Text = iterations.ToString();
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Bitmap bmp = new Bitmap(cellMap.Dimensions.Width, cellMap.Dimensions.Height);
Graphics gBmp = Graphics.FromImage(bmp);
int rectWidth = scaleFactor;
int rectHeight = scaleFactor;
// Create solid brushes
Brush blueBrush = new SolidBrush(Color.Blue);
Brush greenBrush = new SolidBrush(Color.Green);
Brush transparentBrush = new SolidBrush(Color.Transparent);
Graphics g = e.Graphics;
for (int i = 0; i < cellMap.Dimensions.Width; i++)
{
for (int j = 0; j < cellMap.Dimensions.Height; j++)
{
// retrieve the rectangle and draw it
Brush whichBrush;
if (cellMap.GetCell(i, j).CurrentState == CellState.State1)
{
whichBrush = blueBrush;
}
else if (cellMap.GetCell(i, j).CurrentState == CellState.State2)
{
whichBrush = greenBrush;
}
else
{
whichBrush = transparentBrush;
}
// draw rectangle to bmp
gBmp.FillRectangle(whichBrush, i, j, 1f, 1f);
}
}
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
g.DrawImage(bmp, 0, 0, pictureBox1.Width, pictureBox1.Height);
}
我遇到的问题是,标签文本只有在最后一次图片框更新完成后才会显示。所以本质上,它不显示1到99。我可以看到图片框在每次刷新后都会更新,因为BMP在每次迭代中都会发生变化。知道吗?
// Code fragement...
// 5 cent solution, add Invalidate/Update
label1.Text = iterations.ToString();
label1.Invalidate();
label1.Update();
要回答您为什么要这样做的问题:Windows窗体程序在一个线程(UI线程)中运行所有内容。这意味着它必须按顺序执行代码,以便在切换回UI代码之前完成一个函数。换句话说,它只有在完成该功能后才能更新图片,所以如果你更新了100次图片,只有最后一张才会真正更新。使用Invalidate/Update代码告诉编译器"暂停"函数的执行,并强制它更新UI,而不是等到函数结束。希望能有所帮助!