【问题标题】:Change text every 30 percent in progress bar c#在进度条 c# 中每 30% 更改一次文本
【发布时间】:2013-12-22 21:03:30
【问题描述】:

我想让每 30% 的进度条,文本发生变化。

我想要做的是,当进度条达到 25% 时,文本发生变化并停止一秒钟,然后又回到 50,然后文本再次发生变化,它一直持续到达到 100%。

这是我的代码:

        public WelcomeScreen()
        {
            InitializeComponent();
            _timer.Interval = 2000;
            label1.ForeColor = Color.White;
        }

        private void WelcomeScreen_Load(object sender, EventArgs e)
        {
            var worker = new BackgroundWorker();

            worker.WorkerReportsProgress = true;
            worker.DoWork += worker_DoWork;
            worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            worker.ProgressChanged += worker_ProgressChanged;
            worker.RunWorkerAsync();
        }

        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            var percentComplete = e.ProgressPercentage;
            var userState = (string)e.UserState;

            progressBar1.Minimum = 0;
            progressBar1.Maximum = 100;
            progressBar1.Value = 100;
            progressBar1.Step = 25;

            if (progressBar1.Step <= 25)
            {
                label1.Text = "Preparing Setup";
            }

            else if (progressBar1.Step <= 50)
            {
                label1.Text = "Preparing Application";
            }

            else if (progressBar1.Step <= 75)
            {
                label1.Text = "Preparing Database";
            }

            else if (progressBar1.Step <= 100)
            {
                label1.Text = "Preparing Contents";
            }

            else
            {
                label1.Text = "Launch Application";
            }
        }

        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            _timer.Enabled = true;
            _timer.Tick += new EventHandler(Timer_Tick);
        }

        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            var currentWorker = (BackgroundWorker)sender;

            currentWorker.ReportProgress(0, "Preparing Setup");
            currentWorker.ReportProgress(25, "Preparing Application");
            currentWorker.ReportProgress(50, "Preparing Database");
            currentWorker.ReportProgress(75, "Preparing Contents");
            currentWorker.ReportProgress(100, "Launch Application");
        }

        void Timer_Tick(object sender, EventArgs e)
        {
            _timer.Enabled = false;

            this.Hide();

            _login.ShowDialog();

            this.Close();
        }

当进度条达到 100% 时,我命令应用程序等待 2 秒,然后在文本更改为“启动应用程序”后显示另一个表单。

【问题讨论】:

  • 那么你为什么要检查progressBar1.Step 的值是多少?你为什么要使用它?只需将Value 设置为等于percentComplete
  • 我想做的是,当进度条达到 25% 时,文本发生变化并停止一秒钟,然后又回到 50,文本再次发生变化,一直持续到先生,它达到了100%。这就是为什么我设置了progressBar1.Step 的值,但文本保持在Preparing Setup
  • 您不需要使用该属性。让 BackgroundWorker 决定进度条的值。
  • 那么,先生,我必须做什么才能更改文本,progressBar.Step 的每个值都达到 25% 和 50% 等等?我想显示该文本。

标签: c# winforms timer progress-bar


【解决方案1】:

WelcomeScreen_Load 中的所有代码都会阻塞 UI 线程,直到它完成。这意味着无论您对进度条做什么,它都不会在完成之前显示它的更改(它将“跳转”到最后的设置)。

你会想要查看Background Workers。这些让您可以异步执行代码,并经常报告当前状态(即:完成百分比)。

所以,一个非常简短的例子:

private void WelcomeScreen_Load(object sender, EventArgs e)
{
    var worker = new BackgroundWorker();
    worker.WorkerReportsProgress = true;
    worker.DoWork += worker_DoWork;
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    worker.ProgressChanged += worker_ProgressChanged;
    worker.RunWorkerAsync();
}

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    var percentComplete = e.ProgressPercentage;
    var userState = (string)e.UserState;

    //do something with these values, like moving your progress bar
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;
    progressBar1.Value = percentComplete;
}

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // do something when the worker completes, like start your timer
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    // do the "work" for the background worker

    var currentWorker = (BackgroundWorker)sender;

    currentWorker.ReportProgress(0, "Just Starting");

    // do your first task
    currentWorker.ReportProgress(25, "Finish First Task");

    // ...
}

【讨论】:

  • 谢谢您,gunr2171 先生,我已经尝试过您的代码,但进度条一直在继续,文本根本没有改变。我将文本放在 worker_ProgressChanged 中。当我放入worker_DoWork时,它给了我错误
  • @Kaoru,请更新您的帖子以准确显示您所做的事情。你需要把你的逻辑放在worker_DoWork。请记住,您不能在worker_DoWork 中操作进度条,您将得到一个跨线程异常。这就是为什么会有worker_ProgressChanged
  • 已编辑代码先生,请再次参考问题。谢谢
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2021-10-17
  • 2023-03-30
  • 2015-08-31
  • 2015-02-10
  • 1970-01-01
  • 2014-05-03
  • 2020-12-21
相关资源
最近更新 更多