Uma barra de progresso é um componente de uma interface gráfica de usuário usado para visualizar a progressão de uma operação de computador estendida, como um download, transferência de arquivos, ou de instalação. Às vezes, o gráfico é acompanhada por uma representação textual do progresso em um formato por cento.
ProgressBar
Representa um controle de barra de progresso do Windows.
Timer
Implementa um timer que gera um evento em intervalos definidos pelo usuário. Desta vez, é otimizado para uso em aplicações Windows Forms e deve ser usado em uma janela.
BackgroundWorker
Executa uma operação em um segmento separado.
ProgressChangedEventHandler
Representa o método que manipulará o evento ProgressChanged da classe BackgroundWorker. Esta classe não pode ser herdada.
Processando Menssagens
Imagine uma barra de progresso que por padrão atinge um valor de 0 à 100, a principio podemos incrementar este valor no evento do clique do botão, porem a GUI sozinha não conseguirá atualizar os frames do andamento do status da barra progresso porque esta ocupada processando o contador do incremento, deste modo podemos ver o progresso vazio(0%) quando iniciar e cheio(100%) quando o contador chegar ao final, entretanto não poderemos ver o andamento desta porcentagem. Para que possamos ver o andamento precisamos trabalhar os processos simultaneamente, em algumas linguagens de programação como o Delphi por exemplo temos o comando Application.ProcessMessages que executa este trabalho para nós. O C# possui uma classe chamada BackgroundWorker e podemos usa-la para executar um trabalho equivalente ao comando do Delphi para processar mensagens.
Exemplo:
Neste exemplo usamos um contador e um temporizador para simular uma tarefa e usamos a classe BackgroundWorker para processar o andamento da tarefa.
C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace barraprogresso { public partial class Form1 : Form { // Declara componentes Label rotulo; ProgressBar progresso; Button botao; Timer tempo = new Timer(); public Form1() { InitializeComponent(); } private void Form1_Shown(object sender, EventArgs e) { // Muda propriedades do formulario this.Text = "DA - Progress Bar"; this.Size = new Size(240, 150); // Cria componentes rotulo = new Label(); progresso = new ProgressBar(); botao = new Button(); // Adiciona texto rotulo.Text = "Progress Bar"; botao.Text = "Ok"; // Adiciona tamanho rotulo.Size = new Size(200, 20); progresso.Size = new Size(200, 20); // Adiciona posição rotulo.Location = new Point(12, 20); progresso.Location = new Point(12, 40); botao.Location = new Point(70, 70); // Alinha componenente rotulo.TextAlign = ContentAlignment.MiddleCenter; // Cria evento do botão botao.Click += new System.EventHandler(this.botao_Click); // Cria processo de background BackgroundWorker backgroundWorker = new BackgroundWorker(); // Cria evento de progresso backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged); // Adiciona componentes ao formulario this.Controls.Add(rotulo); this.Controls.Add(progresso); this.Controls.Add(botao); } // Cria um temporizador private void temporizador() { tempo.Interval = 250; tempo.Tick += new EventHandler(andamento); tempo.Start(); } // Incrementa a barra de progresso baseado no temporizador private void andamento(object sender, EventArgs e) { progresso.Increment(1); if (progresso.Value == progresso.Maximum) { tempo.Stop(); } } // Processa menssagens de progresso private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progresso.Value = e.ProgressPercentage; } // Evento de clique do botão private void botao_Click(object sender, EventArgs e) { progresso.Value = 0; progresso.Maximum = 100; progresso.Step = 1; temporizador(); } } }