83

我正在使用 C# 和 Windows 窗体。我在程序中有一个正常的进度条工作正常,但现在我有另一个操作无法轻松计算持续时间。我想显示一个进度条,但不知道启动/停止滚动选取框的最佳方式。我希望有一些简单的东西,比如设置选取框速度,然后有一个 start() 和 stop() ,但它似乎并不那么简单。我必须在后台运行一个空循环吗?我怎样才能最好地做到这一点?谢谢

4

7 回答 7

119

使用样式设置为 的进度条Marquee。这表示一个不确定的进度条。

myProgressBar.Style = ProgressBarStyle.Marquee;

您还可以使用该MarqueeAnimationSpeed属性来设置小块色块在进度条上设置动画所需的时间。

于 2008-11-23T21:40:20.600 回答
59

要开始/停止动画,您应该这样做:

开始:

progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 30;

停止:

progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
于 2009-03-03T18:06:01.400 回答
9

这不是他们的工作方式。您通过使其可见来“启动”选取框样式的进度条,通过隐藏它来停止它。您可以更改 Style 属性。

于 2008-11-23T21:52:00.157 回答
9

此代码是用户等待身份验证服务器响应的登录表单的一部分。

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();
        }
    }
}    
于 2011-07-14T23:16:05.870 回答
2

MSDN 上有一篇不错的文章,其中包含有关此主题的代码。我假设将 Style 属性设置为 ProgressBarStyle.Marquee 是不合适的(或者那是您要控制的??-尽管您可以控制速度,但我认为无法停止/启动此动画正如@Paul 指出的那样)。

于 2008-11-23T21:29:05.910 回答
2

这里已经有很多好的答案,尽管您还需要记住,如果您在 UI 线程上进行长时间运行的处理(通常是一个坏主意),那么您也不会看到选取框移动。

于 2015-07-13T20:29:25.763 回答
-3

您可以使用计时器(System.Windows.Forms.Timer)。

钩住它的 Tick 事件,前进然后进度条,直到它达到最大值。当它(达到最大值)并且您没有完成工作时,将进度条值重置为最小值。

...就像 Windows 资源管理器 :-)

于 2008-11-23T20:55:12.470 回答