我正在使用C#和Windows Forms。我在程序中有一个正常的进度条,但现在我有另一个操作,其持续时间无法轻易计算。我想显示一个进度条,但不知道开始/停止滚动标语的最佳方法。我希望能够设置标语的速度,然后进行start()和stop(),但似乎并不那么简单。我需要在后台运行一个空循环吗?我应该如何最好地做到这一点?谢谢
我正在使用C#和Windows Forms。我在程序中有一个正常的进度条,但现在我有另一个操作,其持续时间无法轻易计算。我想显示一个进度条,但不知道开始/停止滚动标语的最佳方法。我希望能够设置标语的速度,然后进行start()和stop(),但似乎并不那么简单。我需要在后台运行一个空循环吗?我应该如何最好地做到这一点?谢谢
使用样式设置为 Marquee
的进度条。这表示一个不确定的进度条。
myProgressBar.Style = ProgressBarStyle.Marquee;
您还可以使用MarqueeAnimationSpeed
属性来设置小色块在进度条上面动画播放的时间。
要开始/停止动画,您应该这样做:
开始:
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 30;
停止:
progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
这段代码是登录表单的一部分,用户需要等待认证服务器响应。
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();
}
}
}
它们的工作方式并非如此。通过使其可见来“启动”跑马灯样式进度条,通过隐藏它来停止它。您可以更改Style属性。
这里已经有很多好的答案了,但你也需要记住,如果你在UI线程上进行长时间处理(通常是一个坏主意),那么你也看不到跑马灯移动。
你可以使用计时器(System.Windows.Forms.Timer)。
挂钩它的Tick事件,将进度条推进到达最大值。当它达到最大值并且你没有完成工作时,将进度条值重置为最小值。
......就像Windows资源管理器一样 :-)