我正在使用C#和Windows窗体。我有一个正常的进度条,可以在程序中正常工作,但是现在我进行了另一项操作,无法轻松计算持续时间。我想显示一个进度条,但不知道启动/停止滚动字幕的最佳方法。我希望能够像设置选取框速度然后具有start()和stop()这样简单的方法,但是它看起来并不那么简单。我是否必须在后台运行一个空循环?我如何最好地做到这一点?谢谢
Answers:
使用样式设置为的进度条Marquee
。这代表了不确定的进度条。
myProgressBar.Style = ProgressBarStyle.Marquee;
您也可以使用该MarqueeAnimationSpeed
属性设置进度条上的小块彩色动画所需的时间。
Marquee
则不会渲染。启用使用功能Application.EnableVisualStyles();
要开始/停止动画,您应该这样做:
开始:
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 30;
停止:
progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
MarqueeAnimationSpeed
停止时不需要设置,启动时通常具有合理的值。启动时无需每次都进行设置。
此代码是登录表单的一部分,用户可以在其中等待身份验证服务器做出响应。
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
namespace LoginWithProgressBar
{
public partial class TheForm : Form
{
// BackgroundWorker object deals with the long running task
private readonly BackgroundWorker _bw = new BackgroundWorker();
public TheForm()
{
InitializeComponent();
// set MarqueeAnimationSpeed
progressBar.MarqueeAnimationSpeed = 30;
// set Visible false before you start long running task
progressBar.Visible = false;
_bw.DoWork += Login;
_bw.RunWorkerCompleted += BwRunWorkerCompleted;
}
private void BwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// hide the progress bar when the long running process finishes
progressBar.Hide();
}
private static void Login(object sender, DoWorkEventArgs doWorkEventArgs)
{
// emulate long (3 seconds) running task
Thread.Sleep(3000);
}
private void ButtonLoginClick(object sender, EventArgs e)
{
// show the progress bar when the associated event fires (here, a button click)
progressBar.Show();
// start the long running task async
_bw.RunWorkerAsync();
}
}
}
您可以使用计时器(System.Windows.Forms.Timer)。
钩住它的Tick事件,前进然后前进进度条,直到达到最大值。当达到(达到最大值)并且您尚未完成作业时,将进度条的值重置为最小值。
...就像Windows资源管理器一样:-)