SIGN UP MEMBER LOGIN:    
ARTICLE

WPF BusyIndicator

Posted by Mahesh Chand Articles | WPF with C# September 02, 2011
A BusyIndicator control provides an alternative to a Windows wait cursor to show user an indication that an application is busy doing some processing. It is a combination of the wait cursor and the ProgressBar control.
Reader Level:
Download Files:
 

WPF BusyIndicator Control

Do you remember the wait cursor or an hourglass cursor in Windows applications? An alternative to the wait cursor is new BusyIndicator control.

A BusyIndicator control provides an alternative to a wait cursor to show user an indication that an application is busy doing some processing. It is a combination of the wait cursor and the ProgressBar control. 

This article demonstrates how to use the BusyIndicator control in a WPF application using C# and XAML.  

Adding Reference to WPF Toolkit Extended Assembly 

The BusyIndicator control is an extension to the WPF Toolkit and does not come with Visual Studio 2010. To use the BusyIndicator control in your application, you must add reference to the WPFToolkit.Extended.dll assembly. You can download Extended WPF Tookit from the CodePlex or you can use the WPFToolkit.Extended.dll available with this download. All you need is the DLL. See Downloads section of this article. 

After downloading the WPFToolkit.Extended.dll, you can add reference to your project by right clicking on the project name in Visual Studio, select Add Reference and browse the DLL.  See Figure 1.

BI1.jpg
Figure 1

Once the assembly reference is added, the next step is to import the namespace in XAML using the xmlns. As soon as you type xmlns in XAML you should see the http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended option in the list. See Figure 2. If you do not see this URL, please read the next section. 

BI2.jpg
Figure 2

Unblocking the WPF Toolkit Assembly 

If an assembly reference is not added to your project correctly, you will see the following message when you build your application.

Unable to load the metadata for assembly 'WPFToolkit.Extended'

You get this message when try to add reference to the Extended WPF Toolkit to a project and build the project.  The problem here is when you download an assembly from a Website, it is block by default. All you need to do is, unblock the assembly.

Right click on the DLL and click Unblock button. See Figure 3.  

BI3.jpg
Figure 3

Remove and add reference again. You are all set.

Creating a BusyIndicator

The BusyIndicator element represents a WPF BusyIndicator control in XAML. The BusyIndicator control is defined in the System.Windows.Controls namespace. Listing 1 creates a simple BusyIndicator control. The IsBusy property is used to show the control. 

 <wpfx:BusyIndicator Name="BusyBar" IsBusy="True" />

Listing 1
The default output of Listing 1 generates Figure 4. 
 
BI4.jpg
Figure 4




BusyContent

The BusyContnet property represents the content part of the control. In Figure 1, you see the default content is Please wait… and if you want to change this message, all you need to do is set the BusyContent property to any text you want.  

 <wpfx:BusyIndicator Name="BusyBar" IsBusy="True" BusyContent="Application is running a background process. Please wait..." />

Listing 2

For example, if I set the BusyContent property listed in Listing 2, the new output looks like Figure 5.
 
BI5.jpg
Figure 5

The BusyContent property doesn't always have to be a text content. It can be any WPF control, panel, or a control hosting multiple controls. Listing 3 creates a BusyIndicator control with Button content in it and the output looks like Figure 6. 

 <wpfx:BusyIndicator Name="BusyBar" IsBusy="True" >
    <wpfx:BusyIndicator.BusyContent>
        <Button Name="BusyButton" Height="40" Width="200" Background="Blue" 
                Foreground="White" Content="I am a Button " Click="BusyButton_Click" />
    </wpfx:BusyIndicator.BusyContent>            
</wpfx:BusyIndicator>

Listing 3

BI6.jpg
 Figure 6

BusyContentTemplate

We can customize a BusyIndicator control using the BusyContentTemplate property.  This property overrides the BusyContent property. Listing 4 sets the BusyContentTemplate property to a DataTemplate that has couple of buttons and a TextBlock. 

 <wpfx:BusyIndicator.BusyContentTemplate>
    <DataTemplate>
        <StackPanel>
            <TextBlock Text="Application is processing data." FontFamily="Georgia" FontWeight="Bold" />                          
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                        <Button Grid.Column="0" Content="Start" HorizontalAlignment="Right" 
                        Width="80" Height="30" Grid.Row="1"/>
                    <Button Grid.Column="2" Grid.Row="1" Content="Stop" HorizontalAlignment="Left" 
                        Width="80" Height="30" />
            </Grid>
        </StackPanel>
    </DataTemplate>
</wpfx:BusyIndicator.BusyContentTemplate>
 Listing 4

The output looks like Figure 7. 

BI7.jpg
 
Figure 7

BusyIndicator in Real World

So, not let's come to our main question. When should you be using the BusyIndicator control in your real world applications? 

The answer is simple. Any time your application needs to show a custom wait message when doing some background processing, you can use the BusyIndicator control. You can also show it to show the progress of the process.

I have built an application looks like Figure 8. The Start Processing button starts some background processing. When the processing is started, I display the BusyIndicator control using the following code:

 BusyBar.IsBusy = true;


And when the processing is completed, I hide the BusyIndicator control. 

 BusyBar.IsBusy = false;


BI8.jpg
Figure 8

Download the attached sample project for more details. You will need understanding the WPF Timer control and the WPF ListBox control to understand this sample.

Summary

In this article, I discussed how we can use a BusyIndicator control in WPF, XAML and C#.  


Login to add your contents and source code to this article
share this article :
post comment
 

Nice article sir, But i have 1 doubt how should i add this BusyBar control in VS 2010.

Posted by Pravin Ghadge Dec 14, 2011

Do you have Visual Studio 2010? You need 2010 for that.

Posted by Mahesh Chand Sep 08, 2011

I used in my project thanks. A question sir , how to upgrade my WPF 3.5 project to WPF 4.0, so that i can use extended toolkit.

Posted by Vishal Nayan Sep 07, 2011
Team Foundation Server Hosting
Become a Sponsor
PREMIUM SPONSORS
  • ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications. Visit DynamicPDF here
    Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Team Foundation Server Hosting
Become a Sponsor