我有一个项目,其中有一个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;
}