修复 WinForms 中的进度条
fix progress bar in WinForms
问题是标签在 progress-bar
完成之前显示。如何让label
只在progress-bar
完全完成后才显示?
我尝试将最大值更改为更高的数值,但没有用。
public partial class dload : Form
{
public dload()
{
InitializeComponent();
}
private void dload_Load(object sender, EventArgs e)
{
label1.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (i = 0; i <= 5000; i++)
{
progressBar1.Value = i;
if (i == 5000)
{
label1.Visible = true;
}
}
}
}
这是一个动画问题。周围一个"hack"其实就是把进度值减1:
progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (int i = 0; i < progressBar1.Maximum; i++) {
progressBar1.Value = i;
progressBar1.Value = Math.Max(i - 1, progressBar1.Minimum);
}
label1.Visible = true;
使用progressBar1.Refresh
:
public partial class dload : Form
{
public dload()
{
InitializeComponent();
}
private void dload_Load(object sender, EventArgs e)
{
label1.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (i = 0; i <= 5000; i++)
{
progressBar1.Value = i;
progressBar1.Refresh();
if (i == 5000)
{
label1.Visible = true;
}
}
}
实际上,您的代码 运行 非常庞大,将值从 0% 设置为 100% 大约不到一秒钟!但
ProgressBar
有两种显示当前状态的样式(Classic
和 Continues
)。
在Continues
模式下,如果进度值从0%到100%,控件会显示动画,这不是显示真实准确的进度。您可以通过 Thread.Sleep()
设置延迟并在 for 循环后立即显示您的标签以了解我发生了什么!
下面的代码可以工作:
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (i = 0; i <= 5000; i++)
{
Thread.Sleep(1);
progressBar1.Value = i;
}
label1.Visible = true;
}
问题是标签在 progress-bar
完成之前显示。如何让label
只在progress-bar
完全完成后才显示?
我尝试将最大值更改为更高的数值,但没有用。
public partial class dload : Form
{
public dload()
{
InitializeComponent();
}
private void dload_Load(object sender, EventArgs e)
{
label1.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (i = 0; i <= 5000; i++)
{
progressBar1.Value = i;
if (i == 5000)
{
label1.Visible = true;
}
}
}
}
这是一个动画问题。周围一个"hack"其实就是把进度值减1:
progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (int i = 0; i < progressBar1.Maximum; i++) {
progressBar1.Value = i;
progressBar1.Value = Math.Max(i - 1, progressBar1.Minimum);
}
label1.Visible = true;
使用progressBar1.Refresh
:
public partial class dload : Form
{
public dload()
{
InitializeComponent();
}
private void dload_Load(object sender, EventArgs e)
{
label1.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (i = 0; i <= 5000; i++)
{
progressBar1.Value = i;
progressBar1.Refresh();
if (i == 5000)
{
label1.Visible = true;
}
}
}
实际上,您的代码 运行 非常庞大,将值从 0% 设置为 100% 大约不到一秒钟!但
ProgressBar
有两种显示当前状态的样式(Classic
和 Continues
)。
在Continues
模式下,如果进度值从0%到100%,控件会显示动画,这不是显示真实准确的进度。您可以通过 Thread.Sleep()
设置延迟并在 for 循环后立即显示您的标签以了解我发生了什么!
下面的代码可以工作:
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 5000;
for (i = 0; i <= 5000; i++)
{
Thread.Sleep(1);
progressBar1.Value = i;
}
label1.Visible = true;
}