Progress Bar In WPF

In this article we are going to learn about Progress bar in WPF, if you are interested to scale your knowledge in WPF to creating industry level applications, you can download book I co-authored with Mahesh Chand,

Download here ==> WPF SIMPLIFIED

The Demo

As always, let me start this by giving you a demo.


The Demo

What is happening here?

There is a WPF control named "Progress bar" which is dancing to the timer's tune. 

Let's learn how to build this.

Progress Bar

Progress bar has lot of attributes but we are interested in 3 specific attributes

  • Value
    This is the real time value that shows the progress.
     
  • Minimum
    The lower limit value we specify here is the minimum value for the progress bar, we have set it to 0, so even if the actual bounded value goes below 0, the progress bar will simply override this with minimum value and stay in its lower limit.
     
  • Maximum
    The upper limit value we specify here is the maximum value for the progress bar, we have set it to 100, so even if the actual bounded value goes beyond 100, progress bar will simply override this with Maximum value and stay in its upper limit. 
<ProgressBar  Name="ProgressBarLoading"
              Minimum="0"
              Maximum="100"
              HorizontalAlignment="Center"
              VerticalAlignment="Center" 
              Value="{Binding ProgressValue}"                      
              Width="300" 
              Height="30"/>

Listing 1: Progress bar

Text on Progress bar

We don't have any attributes right out of the box to show progress in the form of text. but we have a trick to achieve this. Here I am using TextBlock and just binding its value with ProgressBar's value. 

<TextBlock Text="{Binding ElementName=ProgressBarLoading, Path=Value, StringFormat={}{0:0}%}" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center" />

Listing 2: TextBlock on Progress bar

Alright what is missing? 

The timer which will increment progress bar value by 10 every second. Simply add following code snippet, 

Note: I am using dispatcher as I don't want to block UI thread. Visit here to learn more about dispatcher in WPF.

public partial class MainWindow: Window {
    private Timer timer;
    public MainWindow() {
        InitializeComponent();
        timer = new Timer(1000);
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        timer.Start();
    }
    void timer_Elapsed(object sender, ElapsedEventArgs e) {
        this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)(() => {
            if (ProgressBarLoading.Value < 100) {
                ProgressBarLoading.Value += 10;
            } else {
                timer.Stop();
            }
        }));
    }
}

Listing 3: MainWindow.xaml.cs


Figure 1: Progress bar

 Let me leave you with one more cool attribute. you can choose to have direction of flow. In following snippet at line number 4, you can see I am using an attribute named FlowDirection.

<ProgressBar  Name="ProgressBarLoading"
              Minimum="0"
              Maximum="100" 
              FlowDirection="RightToLeft"
              Value="30"/>

Listing 4: FlowDirection = "RightToLeft"


Figure 2: FlowDirection = "RightToLeft"

Conclusion

Now we know how to use progress bar in WPF, how to use timer with progress bar and learned about a few attributes which are progress bar specific.

This is how you can create a Progress bar in WPF, same like this if you want to learn WPF in detail, You can download the book Mahesh & I wrote, WPF Simplified

Learn all the basics, UI controls, styles, graphics, object communications and data binding with different data sources.