miércoles, 12 de junio de 2013

Cargar progressbar en WPF








Código C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace progressbarwpf
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
           //llamada al método cargar_barra() para cargar el progressbar
            cargar_barra();
        }

        //se crea un delegado que permita utilizar un método
        //para actualizar el valor del progressbar
        private delegate void DelegadoActualizaProgressBar(System.Windows.DependencyProperty dp, Object valor);

        //método para cargar el progressbar
        private void cargar_barra()
        {
            //Configuración del ProgressBar
            progressBar1.Minimum = 0;//valor mínimo (inicio de la barra de carga)
            progressBar1.Maximum = 100;//valor máximo(hasta donde se carga, como ejemplo 100)
            progressBar1.Value = 0;//valor de inicio

            //almacenamos el valor del progressbar con la siguiente variable
            double valor = 0;

           //creamos una nueva instancia del delegado  del progressbar
           //que apunte al método que actualiza el valor del progressbar
            DelegadoActualizaProgressBar DelegadoActualizaPB = new DelegadoActualizaProgressBar(progressBar1.SetValue);
           
            //ciclo cerrado: se cicla hasta que el progressbar alcanza el valor máximo
            do
            {
                //incrementamos en 1 a valor
                valor += 1;

                /*se actualiza el valor d el progressbar
                 a) se llama al delegado que actualiza el valor del progressbar
                 b) se asina como prioridad del despachador al background
                 c) se pasa la variable valor al array que contiene la propiedad para actualizar el progressbar */
                           
                Dispatcher.Invoke(DelegadoActualizaPB,
                    System.Windows.Threading.DispatcherPriority.Background,
                    new object[] { ProgressBar.ValueProperty, valor });
            }
            //terminará de ciclar cuando el valor del progressbar
            //sea igual al valor máximo definido previamente
            while (progressBar1.Value != progressBar1.Maximum);
        }

    }
}


Código XAML
<Window x:Class="progressbarwpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ProgressBar Height="28" HorizontalAlignment="Left" Margin="29,95,0,0"
                     Name="progressBar1" VerticalAlignment="Top" Width="449" />
        <Button Content="Cargar" Height="23" HorizontalAlignment="Left" Margin="181,185,0,0"
                Name="button1" VerticalAlignment="Top" Width="118" Click="button1_Click" />
    </Grid>
</Window>


Si se desea cargar la barra de manera progresiva el código puede ser el siguiente, en el cual la barra aumenta su valor en 10 cada vez que se presiona el botón “Aumentar progressbar”, al finalizar la carga muestra un mensaje.
Código C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace progressbarwpf
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //llamada al método aumenta_progressbar() para
            //aumentar el valor del progressbar
            aumenta_progressbar();
        }
       public  double valor = 0;
        //se crea un delegado que permita utilizar un método
        //para actualizar el valor del progressbar
        private delegate void DelegadoActualizaProgressBar(System.Windows.DependencyProperty dp, Object valor);
        //metodo para configurar el progressbar se llama en el evento loaded de la forma
       public void configura_progressbar()
       {
           //Configuración del ProgressBar
           progressBar1.Minimum = 0;//valor mínimo (inicio de la barra de carga)
           progressBar1.Maximum = 100;//valor máximo(hasta donde se carga, como ejemplo 100)
           progressBar1.Value = 0;//valor de inicio

           //almacenamos el valor del progressbar con la siguiente variable
        

          
       }
        //método para aumentar gradualmente el valor del progressbar 
        public void aumenta_progressbar()
        {
            //creamos una nueva instancia del delegado  del progressbar
            //que apunte al método que actualiza el valor del progressbar
            DelegadoActualizaProgressBar DelegadoActualizaPB = new DelegadoActualizaProgressBar(progressBar1.SetValue);//incrementamos en 1 a valor
            valor += 10;

            /*se actualiza el valor d el progressbar
             a) se llama al delegado que actualiza el valor del progressbar
             b) se asina como prioridad del despachador al background
             c) se pasa la variable valor al array que contiene la propiedad para actualizar el progressbar */

            Dispatcher.Invoke(DelegadoActualizaPB,
                System.Windows.Threading.DispatcherPriority.Background,
                new object[] { ProgressBar.ValueProperty, valor });
            //si llega al máximo mostramos un mensaje
            if (progressBar1.Value==progressBar1.Maximum)
            {
                MessageBox.Show("Barra cargada totalente");
            }
        }
        //evento loaded de la forma
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //lamada al método configura_progressbar()
            //para configurar el progressbar
            configura_progressbar();
        }
    }
}


Código XAML
<Window x:Class="progressbarwpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <ProgressBar Height="28" HorizontalAlignment="Left" Margin="29,95,0,0"
                     Name="progressBar1" VerticalAlignment="Top" Width="449"  />
        <Button Content="Aumentar progressbar" Height="23" HorizontalAlignment="Left" Margin="159,184,0,0"
                Name="button1" VerticalAlignment="Top" Width="161" Click="button1_Click" />
    </Grid>
</Window>



No hay comentarios:

Publicar un comentario