Windows Forms ProgressBar:启动/停止字幕的最简单方法?


79

我正在使用C#和Windows窗体。我有一个正常的进度条,可以在程序中正常工作,但是现在我进行了另一项操作,无法轻松计算持续时间。我想显示一个进度条,但不知道启动/停止滚动字幕的最佳方法。我希望能够像设置选取框速度然后具有start()和stop()这样简单的方法,但是它看起来并不那么简单。我是否必须在后台运行一个空循环?我如何最好地做到这一点?谢谢


3
这是一篇有关选择进度条类型的好文章msdn.microsoft.com/zh-cn/library/windows/desktop/aa511486.aspx
Matthew Lock

Answers:


114

使用样式设置为的进度条Marquee。这代表了不确定的进度条。

myProgressBar.Style = ProgressBarStyle.Marquee;

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


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

57

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

开始:

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

停止:

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

7
MarqueeAnimationSpeed停止时不需要设置,启动时通常具有合理的值。启动时无需每次都进行设置。
icktoofay,2010年

9

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


8

此代码是登录表单的一部分,用户可以在其中等待身份验证服务器做出响应。

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

2

在MSDN上,有一篇很好的文章介绍了有关此主题的代码。我假设将Style属性设置为ProgressBarStyle.Marquee是不合适的(或者是您要控制的东西???-尽管可以控制速度,但我认为无法停止/启动此动画如@Paul所示)。


2

尽管您还需要记住,如果您正在UI线程上进行长时间运行的处理(通常是个坏主意),那么您也不会看到选取框也在移动。


-3

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

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

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


2
这违反了“不要重新启动进度”。和不良的UI / UX。请参阅:msdn.microsoft.com/en-us/library/windows/desktop/...
urbanhusky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.