【问题标题】:Windows Forms ProgressBar: Easiest way to start/stop marquee?Windows 窗体 ProgressBar:启动/停止选取框的最简单方法?
【发布时间】:2008-11-23 20:49:07
【问题描述】:

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

【问题讨论】:

标签: c# winforms progress-bar


【解决方案1】:

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

myProgressBar.Style = ProgressBarStyle.Marquee;

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

【讨论】:

  • 如果未启用“视觉样式”,Marquee 将不会呈现。启用使用Application.EnableVisualStyles();
【解决方案2】:

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

开始:

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

停止:

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

【讨论】:

  • 停止的时候不需要设置MarqueeAnimationSpeed,启动的时候一般都有一个合理的值。无需每次启动时都设置。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-27
          • 2012-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-11
          相关资源
          最近更新 更多