Windows窗体进度条:启动/停止跑马灯的最简单方法是什么?

85

我正在使用C#和Windows Forms。我在程序中有一个正常的进度条,但现在我有另一个操作,其持续时间无法轻易计算。我想显示一个进度条,但不知道开始/停止滚动标语的最佳方法。我希望能够设置标语的速度,然后进行start()和stop(),但似乎并不那么简单。我需要在后台运行一个空循环吗?我应该如何最好地做到这一点?谢谢


3
这是一篇关于选择进度条类型的好文章,链接为http://msdn.microsoft.com/en-us/library/windows/desktop/aa511486.aspx。 - Matthew Lock
7个回答

123

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

myProgressBar.Style = ProgressBarStyle.Marquee;

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


30
如果未启用“视觉样式”,则“Marquee”不会渲染。要启用,请使用“Application.EnableVisualStyles();”。 - Pooven

64

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

开始:

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

停止:

progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;

7
停止跑马灯时不需要设置“MarqueeAnimationSpeed”,而在启动它时,通常会有一个合理的值。每次启动时都不需要设置它。 - icktoofay

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();
        }
    }
}    

9

它们的工作方式并非如此。通过使其可见来“启动”跑马灯样式进度条,通过隐藏它来停止它。您可以更改Style属性。


2

这里已经有很多好的答案了,但你也需要记住,如果你在UI线程上进行长时间处理(通常是一个坏主意),那么你也看不到跑马灯移动。


2
这段文本的意思是:“在 MSDN 上有一篇关于此主题的带有代码的好文章article。我假设将 Style 属性设置为 ProgressBarStyle.Marquee 不合适(或者这正是你想要控制的?? - 我认为无法停止/启动此动画,尽管您可以像 @Paul 所示那样控制速度)。”

-3

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

挂钩它的Tick事件,将进度条推进到达最大值。当它达到最大值并且你没有完成工作时,将进度条值重置为最小值。

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


2
这是违反“不要重新开始进度”和糟糕的UI/UX。请参见:http://msdn.microsoft.com/en-us/library/windows/desktop/dn742475%28v=vs.85%29.aspx - urbanhusky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接