【问题标题】:Progress bar value just blinks and disappears进度条值只是闪烁并消失
【发布时间】:2013-07-08 11:30:23
【问题描述】:

我正在尝试将百分比值放入我的进度条,但它看起来像一个闪烁然后消失。

这是我的ProgressChanged 活动:

C# 代码

public void button1_click(object sender, EventArgs e)
{
BackgroundWorker _worker = new BackgroundWorker();
                _worker.WorkerReportsProgress = true;
                _worker.ProgressChanged += new ProgressChangedEventHandler(_worker_ProgressChanged);
                _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);                
                _worker.DoWork += (s, e2) =>
                {
                    for (int i = 0; i <= xmlnode.Count - 1; i++)
                    {
                         _worker.ReportProgress((int)100 * i / (xmlnode.Count - 1));
                         // Many validations here
                    }
                 }
}

void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {            
            progressBar1.Value = e.ProgressPercentage;            

             // Here I tryied to put the percentage value in progress bar

            int percent = (int)(((double)progressBar1.Value / (double)progressBar1.Maximum) * 100);
            progressBar1.CreateGraphics().DrawString(percent.ToString() + "%", new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
        }

【问题讨论】:

  • 如何为您的工作人员调用 ReportProgress?
  • 什么闪烁和消失? ProgressBar 控件?控件中的栏?文字?
  • @SebastianNegraszus 在我的进度条中通知 porcentage 的文本值。
  • @JleruOHeP 我用这些信息更新了我的问题。
  • 无论您使用 CreateGraphics() 绘制的内容,都会在 ProgressBar 重新绘制自身时再次快速擦除。是的,看起来它“闪烁”。您将需要一种不同类型的进度条控件,而不是工具箱中的那个。通过从 Control 类派生它们很容易自己创建。

标签: c# winforms


【解决方案1】:

文本只是闪烁,因为它没有在 Paint 上重绘。使用进度条的Paint 事件并在那里绘制百分比。您只需将其存储在类变量中即可轻松获取该百分比。

【讨论】:

    【解决方案2】:

    进度条是一个动画控件。当您更改其百分比时,它会使其绘制表面无效并完全重新绘制它。这意味着您的百分比是在一帧中绘制的,然后随着动画的播放而消失。

    要解决此问题,您必须创建一个继承自 Control 或 Progress bar 的新控件,并将您的代码添加到处理百分比写入的 OnPaint 事件。通过在 OnPaint 中,每次控件重新绘制自身时都会执行它,而不仅仅是一次。或者,只需将委托挂钩到现有进度条的现有 Paint 事件,这可能更容易。

    看起来像:

    //Somewhere during initialisation, this is called once only
    progressBar1.Paint+= new PaintEventHandler((object sender, PaintEventArgs e) => 
    e.Graphics.DrawString(progressBar1.Value.ToString() + "%", new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2021-04-10
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多