如何在不可见的情况下更新WinForms进度条,然后以更新后的值显示



我有一个项目,其中有一个UserControl,它是一个下载状态面板,里面有一个进度条。默认情况下,该面板是隐藏的,当用户按下按钮时会显示。在后台,进度条随着下载的进行而更新。

问题

当我显示下载面板时,进度条从零开始,然后动画化到其实际值,给人一种这样的错觉,即这个进度只是在你打开面板时发生的。

我怎么能让它只显示它在哪里,而不是从零开始,然后向上。我想要当面板打开并且进度实时发生时的动画,但当我打开面板时,它应该从当前进度开始。

我有一个简单的演示项目,它有以下代码来复制这个问题。复制步骤为:

  • 创建一个VS.NETWinForms项目并添加以下UserControl和Form
  • 运行项目
  • 点击";将进度设置为50%";按钮
  • 点击";显示进度用户控件";按钮
  • 预期行为:进度条显示为50%
  • 实际行为:进度条显示为0%,然后设置为50%

我曾尝试使用ProgressBar.Invalidate使其无效,然后调用ProgressBar.Update,但没有任何区别。我搜索了整个网络,但没有看到这个问题,我看到的所有问题都与线程有关,而这不是。

任何帮助都将不胜感激。

用户控制

public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
this.Size = new Size(351, 48);
this.Visible = false;
progressBar1 = new ProgressBar();
progressBar1.Location = new System.Drawing.Point(15, 22);
progressBar1.Name = "progressBar1";
progressBar1.Size = new System.Drawing.Size(322, 5);
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
this.Controls.Add(progressBar1);
}
public void SetPogress(int progress)
{
progressBar1.Value = progress;
progressBar1.Update();
}
}

表单

public partial class Form1 : Form
{
UserControl1 uc1 = null;
public Form1()
{
InitializeComponent();
// Add User Control with ProgressBar
uc1 = new UserControl1();
uc1.Location = new Point(50, 400);
this.Controls.Add(uc1);
// Add Set Progess Button
var btn_SetProgress = new System.Windows.Forms.Button();
btn_SetProgress.Location = new System.Drawing.Point(47, 46);
btn_SetProgress.Name = "btn_SetProgress";
btn_SetProgress.Size = new System.Drawing.Size(113, 23);
btn_SetProgress.Text = "Set Progress to 50%";
btn_SetProgress.Click += this.btn_SetProgress_Click;
this.Controls.Add(btn_SetProgress);
// Add Show Progess Button
var btn_ShowProgress = new System.Windows.Forms.Button();
btn_ShowProgress.Location = new System.Drawing.Point(47, 91);
btn_ShowProgress.Name = "btn_ShowProgress";
btn_ShowProgress.Size = new System.Drawing.Size(147, 23);
btn_ShowProgress.Text = "Show Progress User Control";
btn_ShowProgress.Click += this.btn_ShowProgress_Click;
this.Controls.Add(btn_ShowProgress);
}
private void btn_SetProgress_Click(object sender, EventArgs e)
{
uc1.SetPogress(50);
}
private void btn_ShowProgress_Click(object sender, EventArgs e)
{
uc1.Visible = true;
}
}

感谢那些做出回应的人。我尝试了两种建议,@Jimi的评论都有效,所以最终的解决方案是更新SetProgress方法,如下所示:

public void SetPogress(int progress)
{
if (!progressBar1.IsHandleCreated) { var h = progressBar1.Handle; }
progressBar1.Value = progress;
}

最新更新