Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Progressbar Stops after a Few Bars

In my WPF application i have to show a progressbar progress with in a timer tick event, which i am writing as below,

System.Windows.Forms.Timer timer;
public MainWindow()
{
    timer = new System.Windows.Forms.Timer();
    timer.Interval = 1000;
    this.timer.Tick += new System.EventHandler(this.timer_Tick);
}

load event as below

private void Window_Loaded(object sender, RoutedEventArgs e)
{
      progressBar1.Minimum = 0;
      progressBar1.Value = DateTime.Now.Second;
      progressBar1.Maximum = 700;
      timer.Start();         
 }

And at last in tick event,

private void timer_Tick(object sender, EventArgs e)
{
    Duration duration = new Duration(TimeSpan.FromSeconds(20));

    //progress bar animation
    System.Windows.Media.Animation.DoubleAnimation doubleanimation = new    System.Windows.Media.Animation.DoubleAnimation(200.0, duration);
    progressBar1.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
}

When the program's progressbar shows the progress for two-three bars and then it stops increment. Later there is no effect in the progress at all.

Why?

like image 772
Sangeetha Avatar asked Mar 15 '13 09:03

Sangeetha


4 Answers

Since your ProgressBar doesn't relate to any particular behavior, it looks like a job for an indeterminate bar.

This other SO question provides some insight about it. In short, it's a XAML one-liner:

<!-- MinVal, MaxVal, Height needed for this to work -->
<ProgressBar x:Name="progressBar1" Margin="5" IsIndeterminate="True" 
    MinimumValue="0" MaximumValue="700" value="0" Height="20"/> 

Then in code, you go like this:

progressBar1.IsIndeterminate = true; // start animation
progressBar1.IsIndeterminate = false; // stop animation
like image 106
Alex Avatar answered Nov 18 '22 06:11

Alex


In my WPF application I have ... System.Windows.Forms.Timer timer;

That is the wrong type of timer. Use a DispatcherTimer instead.

When i execute my program progressbar shows the progress for two-three bars and then it stops

This surprises me, I wouldn't have expected it to work at all. This means you may have other problems too, like blocking the main (dispatcher) thread.

You are only setting the Value once, in the Loaded event:

     progressBar1.Value = DateTime.Now.Second;

There is no change to progressBar1.Value in the Tick event. So it figures that it stops moving.

like image 26
Henk Holterman Avatar answered Nov 18 '22 05:11

Henk Holterman


Use DispatcherTimer instead of Timer (Forms object), and use Value property of ProgressBar.

Try this:

MainWindows.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="55" Width="261">
    <Grid>
        <ProgressBar Name="pb" Maximum="60" />
    </Grid>
</Window>

MainWindows.xaml.cs:

using System.Windows;
using System.Windows.Threading;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private DispatcherTimer timer;
    
        public MainWindow()
        {
            InitializeComponent();

            this.timer = new DispatcherTimer();
            this.timer.Tick += timer_Tick;
            this.timer.Interval = new System.TimeSpan(0, 0, 1);
            this.timer.Start();
        }

        private void timer_Tick(object sender, System.EventArgs e)
        {
            this.pb.Value = System.DateTime.Now.Second % 100;
        }
    }
}

You can change the behaviour of the progress bar by changing the Value property (don't forget defining the Maximum property in the xaml).

like image 4
Xaruth Avatar answered Nov 18 '22 05:11

Xaruth


I found this (WPF Multithreading: Using the BackgroundWorker and Reporting the Progress to the UI. link) to contain a great solution for my needs, albeit with a dialog box.

The one thing I found very useful was that the worker thread couldn't access the MainWindow's controls (in its own method). However, when using a delegate inside the main windows event handler, it was possible.

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    pd.Close();
    // Get a result from the asynchronous worker
    T t = (t)args.Result
    this.ExampleControl.Text = t.BlaBla;
};
like image 3
lko Avatar answered Nov 18 '22 05:11

lko