User Interface for .NET / User's Guide / Custom Forms / Task Dialog

Task Dialog
 Overview
The NTaskDialog is a modern replacement of the standard plain MessageBox plus feature-rich user input dialog. Inspired by the excellent TaskDialogs in Microsoft Windows Vista, our component will bring to your Windows Forms applications platform independent Vista-like experience.
 Behavior

The dialog’s Show method will return the id (integer value) of the clicked button rather than a value from the DialogResult enumeration. You may examine the returned result like this:

C#
Copy Code
int result = myTaskDialog.Show();
if(result != (int)DialogResult.OK)
    return;

// continue with application logic
...
Visual Basic
Copy Code
Dim result As Integer = myTaskDialog.Show()
If result <> CInt(DialogResult.OK) Then
    return

' continue with application logic
...
 Standard Features

The default, non-customized task dialog will behave like a standard message box. Specify the title, content’s text and/or icon, common buttons (the default one is "OK") and call its Show method:

 User-defined Buttons

In many cases you will need a message box with buttons are not "common" – for example you may not change the text or order of the standard ones. The NTaskDialog overcomes this limitation by exposing an additional array of user-definable NPushButtonElement generic UI elements which are completely customizable in any aspect of visual representation.

The following example demonstrates how to create and assign custom buttons to an NTaskDialog:

C#
Copy Code
using Nevron.UI;
using Nevron.UI.WinForm;
using Nevron.UI.WinForm.Controls;

NTaskDialog dialog = new NTaskDialog ();
dialog.Title = "My Task Dialog";
dialog.Content.Image = NSystemImages.Information;
dialog.Content.ImageSize = new NSize(32, 32);
dialog.Content.Text = "Performing my custom task...";

NPushButtonElement cancelButton = new NPushButtonElement();
cancelButton.Text = "<b>Cancel Download</b>";
cancelButton.Id = 1;

NPushButtonElement pauseButton = new NPushButtonElement();
pauseButton.Text = "<b>Pause Download</b>";
pauseButton.Id = 2;

// assign the newly created buttons to the dialog
dialog.UserButtons = new NPushButtonElement[] { cancelButton, pauseButton};

// display the dialog to the user
int result = dialog.Show();

// perform specific action
switch(result)
{
    case 1:
        Cancel();
        break;
    case 2:
        Pause();
        break;
}
Visual Basic
Copy Code
Imports Nevron.UI
Imports Nevron.UI.WinForm
Imports Nevron.UI.WinForm.Controls

Dim dialog As NTaskDialog = New NTaskDialog ()
dialog.Title = "My Task Dialog"
dialog.Content.Image = NSystemImages.Information
dialog.Content.ImageSize = New NSize(32, 32)
dialog.Content.Text = "Performing my custom task..."

Dim cancelButton As NPushButtonElement = New NPushButtonElement()
cancelButton.Text = "<b>Cancel Download</b>"
cancelButton.Id = 1

Dim pauseButton As NPushButtonElement = New NPushButtonElement()
pauseButton.Text = "<b>Pause Download</b>"
pauseButton.Id = 2

' assign the newly created buttons to the dialog
dialog.UserButtons = New NPushButtonElement() { cancelButton, pauseButton}

' display the dialog to the user
Dim result As Integer = dialog.Show()

' perform specific action
Select Case result
    case 1
        Cancel()
    case 2
        Pause()
End Select 

 Large Buttons

The NTaskDialog exposes yet another array of user-definable buttons which are laid-out and displayed in a different way. Large buttons expand all the client width of the dialog and are arranged in a vertical stack straight under the Content area. They are also painted in a slightly different way – in "Normal" state they do not have a background style applied.

Large buttons are created and specified in much the same way as the standard user buttons in the upper example.

 Marquee Progress

Often an application needs to display a dialog notifying that an operation with indeterminate length is currently running. Our NTaskDialog comes with a built-in support for displaying a marquee progress along with the rest of the content and buttons.

The following example demonstrates how to create and show a dialog which displays marquee progress:

C#
Copy Code
using Nevron.UI;
using Nevron.UI.WinForm;
using Nevron.UI.WinForm.Controls;

NTaskDialog dialog = new NTaskDialog ();
dialog.Title = "Marquee Progress Task Dialog";
dialog.Content.Image = NSystemImages.Information;
dialog.Content.ImageSize = new NSize(32, 32);
dialog.Content.Text = "Downloading...";

dialog.ProgressType = TaskDialogProgressType.Marquee;
// start the marquee loop as it is not started by default
dialog.MarqueeProgress.Start();

// display the dialog to the user
dialog.Show();
Visual Basic
Copy Code
Imports Nevron.UI
Imports Nevron.UI.WinForm
Imports Nevron.UI.WinForm.Controls

Dim dialog As NTaskDialog = New NTaskDialog ()
dialog.Title = "Marquee Progress Task Dialog"
dialog.Content.Image = NSystemImages.Information
dialog.Content.ImageSize = New NSize(32, 32)
dialog.Content.Text = "Downloading..."

dialog.ProgressType = TaskDialogProgressType.Marquee
' start the marquee loop as it is not started by default
dialog.MarqueeProgress.Start()

' display the dialog to the user
dialog.Show()

 Standard Progress Bar
The NTaskDialog component may also display a standard progress bar instead of a marquee one. Simply set the ProgressType property to be TaskDialogProgressType.Standard.
 Verification

Yet another useful add-on in the NTaskDialog over the standard message box is the so called "Verification" – a check box with additional option – like "Do not display this message again". The verification will be displayed under the user buttons, before the footer.

The following example demonstrates how to create and show a task dialog which displays verification:

C#
Copy Code
using Nevron.UI;
using Nevron.UI.WinForm;
using Nevron.UI.WinForm.Controls;

NTaskDialog dialog = new NTaskDialog ();
dialog.Title = "Save File";
dialog.Content.Image = NSystemImages.Warning;
dialog.Content.ImageSize = new NSize(32, 32);
dialog.Content.Text = "Are you sure you want to exit without saving the file?";

dialog.PredefinedButtons = TaskDialogButtons.Yes | TaskDialogButtons.No | TaskDialogButtons.Cancel;

// specify verification text
dialog.Verification.Text = "Remember my choice and do not remind me again";

// display the dialog to the user
dialog.Show();

// determine the state of the verification
if(dialog.Verification.CheckState == CheckState.Checked)
{
    // remember the user’s choice
}
Visual Basic
Copy Code
Imports Nevron.UI
Imports Nevron.UI.WinForm
Imports Nevron.UI.WinForm.Controls

Dim dialog As NTaskDialog = New NTaskDialog ()
dialog.Title = "Save File"
dialog.Content.Image = NSystemImages.Warning
dialog.Content.ImageSize = New NSize(32, 32)
dialog.Content.Text = "Are you sure you want to exit without saving the file?"

dialog.PredefinedButtons = TaskDialogButtons.Yes Or TaskDialogButtons.No Or TaskDialogButtons.Cancel

' specify verification text
dialog.Verification.Text = "Remember my choice and do not remind me again"

' display the dialog to the user
dialog.Show()

' determine the state of the verification
If dialog.Verification.CheckState = CheckState.Checked Then
    ' remember the user’s choice
End If

 Footer
The footer in the NTaskDialog is represented by an NLabelElement which is positioned at the bottom of the client rectangle.
 Timer
Additionally you may enable a timer which may be used for various tasks like updating the progress, content text, verification state, etc. Simply specify the EnableTimer and TimerInterval properties of the dialog.
 Notifications

The task dialog provides a convenient way for hooking to different notifications like Loaded, Closing/Closed, ButtonClick, TimerTick, etc. via a delegate which is called for every notification.

The following example demonstrates how to create and show a task dialog which displays an increasing progress-bar:

C#
Copy Code
using Nevron.UI;
using Nevron.UI.WinForm;
using Nevron.UI.WinForm.Controls;

NTaskDialog dialog = new NTaskDialog ();
dialog.Title = "File Download";
dialog.Content.Image = NSystemImages.Information;
dialog.Content.ImageSize = new NSize(32, 32);
dialog.Content.Text = "Downloading...";

dialog.PredefinedButtons = TaskDialogButtons.Cancel;

// specify verification text
dialog.Verification.Text = "Close this dialog when download is complete";
// display a standard progress bar
dialog.ProgressType = TaskDialogProgressType.Standard;

// enable the timer
dialog.EnableTimer = true;
dialog.TimerInterval = 100;

dialog.Notify += new NTaskDialogCallBack(OnTaskDialogCallBack);

// display the dialog to the user
dialog.Show();

... 

// the callback implementation
private void OnTaskDialogCallBack(object sender, NTaskDialogEventArgs e)
{
    if(e.Notification == TaskDialogNotification.TimerTick)
    {
        e.Dialog.ProgressBar.Value++;
    }
}
Visual Basic
Copy Code
Imports Nevron.UI
Imports Nevron.UI.WinForm
Imports Nevron.UI.WinForm.Controls

Dim dialog As NTaskDialog = New NTaskDialog ()
dialog.Title = "File Download"
dialog.Content.Image = NSystemImages.Information
dialog.Content.ImageSize = New NSize(32, 32)
dialog.Content.Text = "Downloading..."

dialog.PredefinedButtons = TaskDialogButtons.Cancel

' specify verification text
dialog.Verification.Text = "Close this dialog when download is complete"
' display a standard progress bar
dialog.ProgressType = TaskDialogProgressType.Standard

' enable the timer
dialog.EnableTimer = True
dialog.TimerInterval = 100

AddHandler Notify, AddressOf OnTaskDialogCallBack

' display the dialog to the user
dialog.Show()

... 

' the callback implementation
Private Sub OnTaskDialogCallBack(ByVal sender As Object, ByVal e As NTaskDialogEventArgs) Handles dialog.Notify
    If e.Notification = TaskDialogNotification.TimerTick Then 
        e.Dialog.ProgressBar.Value += 1
    End If
End Sub

Note that the "sender" parameter of the callback depends on the notification – for example it will be an NPushButtonElement for ButtonClick and the internally created NForm for Loaded.

See Also