Actualización: noviembre 2007
Representa un control de barra de progreso de Windows contenido en un control StatusStrip.
Ensamblado: System.Windows.Forms (en System.Windows.Forms.dll)
Public Class ToolStripProgressBar _ Inherits ToolStripControlHost
Dim instance As ToolStripProgressBar
public class ToolStripProgressBar : ToolStripControlHost
public ref class ToolStripProgressBar : public ToolStripControlHost
public class ToolStripProgressBar extends ToolStripControlHost
public class ToolStripProgressBar extends ToolStripControlHost
ToolStripProgressBar es el ProgressBar optimizado para el alojamiento en ToolStrip. En el nivel ToolStripProgressBar se expone un subconjunto de las propiedades y los eventos del control alojado, pero se puede obtener acceso total al control ProgressBar subyacente mediante la propiedad ProgressBar.
Un control ToolStripProgressBar indica visualmente el progreso de una operación larga. El control ToolStripProgressBar muestra una barra que se llena de izquierda a derecha con el color de resaltado del sistema a medida que progresa la operación.
Nota:
|
|---|
|
El control ToolStripProgressBar sólo puede tener orientación horizontal. |
Normalmente, el control ToolStripProgressBar se utiliza cuando una aplicación realiza tareas como copiar archivos o imprimir documentos. Los usuarios de una aplicación podrían pensar que ésta no responde si no se les ofrece una señal visual. Utilice ToolStripProgressBar para notificar al usuario que la aplicación está realizando una tarea larga y que la aplicación todavía está respondiendo.
Las propiedades Maximum y Minimum definen el intervalo de valores que representarán el progreso de una tarea. Normalmente, la propiedad Minimum se establece en cero, y la propiedad Maximum se establece en un valor que indica que la tarea ha terminado. Por ejemplo, para mostrar correctamente el progreso al copiar un grupo de archivos, la propiedad Maximum se podría establecer en el número total de archivos que se van a copiar. La propiedad Value representa el progreso que la aplicación realiza para terminar la operación. Como la barra que se muestra en el control es una colección de bloques, el valor que muestra ToolStripProgressBar sólo se aproxima al valor real de la propiedad Value. Según el tamaño del control ToolStripProgressBar, la propiedad Value determina cuándo se debe mostrar el siguiente bloque.
Existen varias maneras de modificar el valor que muestra el control ToolStripProgressBar además de modificar la propiedad Value directamente. Se puede utilizar la propiedad Step para especificar el valor con que se incrementará la propiedad Value y, después, llamar al método PerformStep para incrementar ese valor. Para variar el valor de incremento, puede utilizar el método Increment y especificar el valor por el que se incrementará la propiedad Value.
ToolStripProgressBar reemplaza el anterior control ProgressBar, que no obstante se mantiene para conservar la compatibilidad con versiones anteriores.
El ejemplo de código siguiente muestra un control ToolStripProgressBar que calcula una secuencia de números de Fibonacci.
Imports System Imports System.Collections.Generic Imports System.Windows.Forms Imports System.ComponentModel Class FibonacciNumber Inherits Form <STAThread()> _ Shared Sub Main() Application.EnableVisualStyles() Application.Run(New FibonacciNumber()) End Sub Private progressStatusStrip As StatusStrip Private toolStripProgressBar As ToolStripProgressBar Private requestedCountControl As NumericUpDown Private goButton As Button Private outputTextBox As TextBox Private backgroundWorker As BackgroundWorker Private toolStripStatusLabel As ToolStripStatusLabel Private requestedCount As Integer Public Sub New() [Text] = "Fibonacci" ' Prepare the StatusStrip. progressStatusStrip = New StatusStrip() toolStripProgressBar = New ToolStripProgressBar() toolStripProgressBar.Enabled = False toolStripStatusLabel = New ToolStripStatusLabel() progressStatusStrip.Items.Add(toolStripProgressBar) progressStatusStrip.Items.Add(toolStripStatusLabel) Dim flp As New FlowLayoutPanel() flp.Dock = DockStyle.Top Dim beforeLabel As New Label() beforeLabel.Text = "Calculate the first " beforeLabel.AutoSize = True flp.Controls.Add(beforeLabel) requestedCountControl = New NumericUpDown() requestedCountControl.Maximum = 1000 requestedCountControl.Minimum = 1 requestedCountControl.Value = 100 flp.Controls.Add(requestedCountControl) Dim afterLabel As New Label() afterLabel.Text = "Numbers in the Fibonacci sequence." afterLabel.AutoSize = True flp.Controls.Add(afterLabel) goButton = New Button() goButton.Text = "&Go" AddHandler goButton.Click, AddressOf button1_Click flp.Controls.Add(goButton) outputTextBox = New TextBox() outputTextBox.Multiline = True outputTextBox.ReadOnly = True outputTextBox.ScrollBars = ScrollBars.Vertical outputTextBox.Dock = DockStyle.Fill Controls.Add(outputTextBox) Controls.Add(progressStatusStrip) Controls.Add(flp) backgroundWorker = New BackgroundWorker() backgroundWorker.WorkerReportsProgress = True AddHandler backgroundWorker.DoWork, AddressOf backgroundWorker1_DoWork AddHandler backgroundWorker.RunWorkerCompleted, AddressOf backgroundWorker1_RunWorkerCompleted AddHandler backgroundWorker.ProgressChanged, AddressOf backgroundWorker1_ProgressChanged End Sub Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) ' This method will run on a thread other than the UI thread. ' Be sure not to manipulate any Windows Forms controls created ' on the UI thread from this method. backgroundWorker.ReportProgress(0, "Working...") Dim lastlast As [Decimal] = 0 Dim last As [Decimal] = 1 Dim current As [Decimal] If requestedCount >= 1 Then AppendNumber(0) End If If requestedCount >= 2 Then AppendNumber(1) End If Dim i As Integer While i < requestedCount ' Calculate the number. current = lastlast + last ' Introduce some delay to simulate a more complicated calculation. System.Threading.Thread.Sleep(100) AppendNumber(current) backgroundWorker.ReportProgress(100 * i / requestedCount, "Working...") ' Get ready for the next iteration. lastlast = last last = current i += 1 End While backgroundWorker.ReportProgress(100, "Complete!") End Sub Delegate Sub AppendNumberDelegate(number As [Decimal]) Private Sub AppendNumber(number As [Decimal]) If outputTextBox.InvokeRequired Then outputTextBox.Invoke(New AppendNumberDelegate(AddressOf AppendNumber), number) Else outputTextBox.AppendText((number.ToString("N0") + Environment.NewLine)) End If End Sub Private Sub backgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) toolStripProgressBar.Value = e.ProgressPercentage toolStripStatusLabel.Text = e.UserState ' End Sub Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) If TypeOf e.Error Is OverflowException Then outputTextBox.AppendText((Environment.NewLine + "**OVERFLOW ERROR, number is too large to be represented by the decimal data type**")) End If toolStripProgressBar.Enabled = False requestedCountControl.Enabled = True goButton.Enabled = True End Sub Private Sub button1_Click(sender As Object, e As EventArgs) goButton.Enabled = False toolStripProgressBar.Enabled = True requestedCount = Fix(requestedCountControl.Value) requestedCountControl.Enabled = False outputTextBox.Clear() backgroundWorker.RunWorkerAsync() End Sub End Class
using System; using System.Collections.Generic; using System.Windows.Forms; using System.ComponentModel; class FibonacciNumber : Form { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new FibonacciNumber()); } private StatusStrip progressStatusStrip; private ToolStripProgressBar toolStripProgressBar; private NumericUpDown requestedCountControl; private Button goButton; private TextBox outputTextBox; private BackgroundWorker backgroundWorker; private ToolStripStatusLabel toolStripStatusLabel; private int requestedCount; public FibonacciNumber() { Text = "Fibonacci"; // Prepare the StatusStrip. progressStatusStrip = new StatusStrip(); toolStripProgressBar = new ToolStripProgressBar(); toolStripProgressBar.Enabled = false; toolStripStatusLabel = new ToolStripStatusLabel(); progressStatusStrip.Items.Add(toolStripProgressBar); progressStatusStrip.Items.Add(toolStripStatusLabel); FlowLayoutPanel flp = new FlowLayoutPanel(); flp.Dock = DockStyle.Top; Label beforeLabel = new Label(); beforeLabel.Text = "Calculate the first "; beforeLabel.AutoSize = true; flp.Controls.Add(beforeLabel); requestedCountControl = new NumericUpDown(); requestedCountControl.Maximum = 1000; requestedCountControl.Minimum = 1; requestedCountControl.Value = 100; flp.Controls.Add(requestedCountControl); Label afterLabel = new Label(); afterLabel.Text = "Numbers in the Fibonacci sequence."; afterLabel.AutoSize = true; flp.Controls.Add(afterLabel); goButton = new Button(); goButton.Text = "&Go"; goButton.Click += new System.EventHandler(button1_Click); flp.Controls.Add(goButton); outputTextBox = new TextBox(); outputTextBox.Multiline = true; outputTextBox.ReadOnly = true; outputTextBox.ScrollBars = ScrollBars.Vertical; outputTextBox.Dock = DockStyle.Fill; Controls.Add(outputTextBox); Controls.Add(progressStatusStrip); Controls.Add(flp); backgroundWorker = new BackgroundWorker(); backgroundWorker.WorkerReportsProgress = true; backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // This method will run on a thread other than the UI thread. // Be sure not to manipulate any Windows Forms controls created // on the UI thread from this method. backgroundWorker.ReportProgress(0, "Working..."); Decimal lastlast = 0; Decimal last = 1; Decimal current; if (requestedCount >= 1) { AppendNumber(0); } if (requestedCount >= 2) { AppendNumber(1); } for (int i = 2; i < requestedCount; ++i) { // Calculate the number. checked { current = lastlast + last; } // Introduce some delay to simulate a more complicated calculation. System.Threading.Thread.Sleep(100); AppendNumber(current); backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working..."); // Get ready for the next iteration. lastlast = last; last = current; } backgroundWorker.ReportProgress(100, "Complete!"); } private delegate void AppendNumberDelegate(Decimal number); private void AppendNumber(Decimal number) { if (outputTextBox.InvokeRequired) { outputTextBox.Invoke(new AppendNumberDelegate(AppendNumber), number); } else { outputTextBox.AppendText(number.ToString("N0") + Environment.NewLine); } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { toolStripProgressBar.Value = e.ProgressPercentage; toolStripStatusLabel.Text = e.UserState as String; } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error is OverflowException) { outputTextBox.AppendText(Environment.NewLine + "**OVERFLOW ERROR, number is too large to be represented by the decimal data type**"); } toolStripProgressBar.Enabled = false; requestedCountControl.Enabled = true; goButton.Enabled = true; } private void button1_Click(object sender, EventArgs e) { goButton.Enabled = false; toolStripProgressBar.Enabled = true; requestedCount = (int)requestedCountControl.Value; requestedCountControl.Enabled = false; outputTextBox.Clear(); backgroundWorker.RunWorkerAsync(); } }
System.MarshalByRefObject
System.ComponentModel.Component
System.Windows.Forms.ToolStripItem
System.Windows.Forms.ToolStripControlHost
System.Windows.Forms.ToolStripProgressBar
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Nota: