Click here to Skip to main content
Click here to Skip to main content

TaskDialog for WinForms

By , 5 Jan 2007
 

Introduction

Vista's new TaskDialog API’s are really cool and should see lame message boxes banished from you application. We've already seen some articles on using them from C++ but they are not trivial to use from managed code, so here is some code that makes using all the features of the new Task Dialogs really easy in WinForms.

The code is C# and is StyleCop, FXCop and PreSharp clean. Usability and discoverability were given preference to performance and size, with plenty of comments that should be really useful in Intellisense as you explore what Task Dialogs can do. You don’t have to use anything with a shouted (all capitals) name and all the features of Task Dialog are exposed including the callback and actions you can perform on an active Task Dialog. If you hate the very idea of wrappers and want the raw interop declarations, they are all there too.

Using the code

The main class is TaskDialog. The simplest usage gets you MessageBox behavior:

    TaskDialog taskDialog = new TaskDialog();
    taskDialog.WindowTitle = "My Application";
    taskDialog.MainInstruction = "Do you want to do this?";
    taskDialog.CommonButtons = TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No;
    int result = taskDialog.Show();
    if (result == (int)DialogResult.Yes)
    {
        // Do it.
    }

TaskDialog with Yes No buttons

From there you can add hyperlinks for help, more structure (adding content, extended info and footer to main instruction), a checkbox for "don’t ask me again", custom button names, etc.:

    private void SampleUsageComplex()
    {
        TaskDialog taskDialog = new TaskDialog();
        taskDialog.WindowTitle = "My Application";
        taskDialog.MainInstruction = "Do you want to do this?";

        taskDialog.EnableHyperlinks = true;
        taskDialog.Content = "If you do this there could be all sorts of consequences. " +
            "If you don't there will be other consequences. " +
            "You can <A HREF=\"Learn\">learn more about those consequences </A> or more " +
            "about <A HREF=\"blah\">blah blah blah</A>.";
        taskDialog.Callback = new TaskDialogCallback(this.MyTaskDialogCallback);
 
        taskDialog.VerificationText = "Don't ask me this ever again.";
        taskDialog.VerificationFlagChecked = false;
 
        TaskDialogButton doItButton = new TaskDialogButton();
        doItButton.ButtonId = 101;
        doItButton.ButtonText = "Do It";
 
        TaskDialogButton dontDoItButton = new TaskDialogButton();
        dontDoItButton.ButtonId = 102;
        dontDoItButton.ButtonText = "Don't Do It";

        taskDialog.Buttons = new TaskDialogButton[] { doItButton, dontDoItButton };
 
        bool dontShowAgain;
        int result = taskDialog.Show(null, out dontShowAgain);
        if (dontShowAgain)
        {
            // Suppress future asks.
        }
        if (result == doItButton.ButtonId)
        {
            // Do it.
        }
    }

    private bool MyTaskDialogCallback(
        ActiveTaskDialog taskDialog, 
        TaskDialogNotificationArgs args, 
        object callbackData)
    {
        if (args.Notification == TaskDialogNotification.HyperlinkClicked)
        {
            if (args.Hyperlink.Equals("Learn", StringComparison.Ordinal))
            {
                // Show a help topic.
            }
            else if (args.Hyperlink.Equals("blah", StringComparison.Ordinal))
            {
                // Show a different help topic.
            }
        }
        return false;
    }

TaskDialog with hyperlink and verify checkbox

To get a better idea of all the things you can do with a TaskDialog download the demo, extract the TaskDialogTest.exe and TaskDialog.dll to the same directory and run TaskDialogTest.exe. You'll get a rather large dialog which, while not beautiful, will let you try out the TaskDialog and perhaps sample what different uses in your application would look like.

TaskDialog with hyperlink and verify checkbox

To make use of TaskDialog in your own solution, download the source and include the following source files in your project and adapt them as you see fit:

  • ActiveTaskDialog.cs
  • TaskDialog.cs
  • TaskDialogNotificationArgs.cs
  • UnsafeNativeMethods.cs

Alternatively you could include the TaskDialog project into you solution.

I look forward to seeing a lot fewer Message Boxes in you applications and I hope this makes it easier. Keep in mind good UI design when you're tempted to use all those features in the one dialog.

License

This article, along with any associated source code and files, is licensed under A Public Domain dedication

About the Author

KevinGre
Software Developer
United States United States
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralVote of 5memberMember 807878515 Jun '12 - 11:51 
Great article!!! Thumbs Up | :thumbsup: Thumbs Up | :thumbsup: Thumbs Up | :thumbsup:
GeneralMy vote of 5membereaviles30 Mar '12 - 8:06 
Very helpful!
QuestionFont Changing... And A QuestionmemberSaeed Masoomi7 Dec '11 - 10:39 
Hi,
I Want Change This Great TaskDialogs Fonts And Use For Example Tahoma,
Can Anyone Help Me?
 
And a question that is this work in windows XP?
 
tnx
GeneralLicensememberuser303425 Feb '11 - 0:31 
Excellent article this one !!
 
I am planning to use this source code in one of my commercial application for my company. Can I use it ? Do I need to mention your name or anything like that ?
 
I went through The Public Domain dedication. But it's quite confusing.
 
Please let me know what all should I do in order to use this source code.
 
Thanks and really appreciate your article.
GeneralCitrix and expanded infomemberStefanie Knapp17 Jul '09 - 0:57 
First of all, thanks for this great work!
 
But I have got one problem with it:
The dialog does not seem to appear on Citrix systems when it contains expanded info.
 
Anyone who has got the same problem? What can I do?
 
Thanks!
QuestionHow change the MainInstruction textmembermelnac9 Jan '09 - 11:57 
Hi,
how can change the MainInstruction text from within the CallBack function ?
 
I call the taskDialog.UpdateMainInstruction method as i use the taskDialog.SetProgressBarPosition to change the position value for the progress bar.
 
I saw that in the EmulateTaskDialog class i need to extend the WndProc to catch the message, but the MainInstruction remains always the same.
 
Can you help ?
Can you explain how to use the Callback function ?
 
Thanks in advance,
Giuseppe.
GeneralIssue in parameter to EnableButton() and EnableRadioButton() when calling from VB.NETmemberAndrewCushen18 Dec '08 - 16:58 
This is great work, and is much appreciated; I started to do this myself in VB.NET, but ran out of time and kept hitting walls with the unsafe code.
 
You may, however, wish to document that there's a minor issue in the EnableButton() and EnableRadioButton() functions in ActiveTaskDialog.CS, when you call the code from VB.NET:
 
The True/False test appears to be reversed when calling these two functions from VB.NET, so that when you pass in the button id and False, the button is enabled. This is contrary to your documentation, which states that passing in False should disable the button, and is also contrary to the behavior when calling your code from C#, where it exhibits the proper behavior.
 
I can only guess that this has to do with the differing way in which the C-based languages treat 0/1 as true/false.
 

With that in mind, there are two approaches a VB.NET user can take to work around the issue.
 
The first, and simplest, is to just remember to reverse True/False when calling the 2 functions from VB.NET.
 
The second is to actually change the code in the C# source to match the documentation. This approach is probably preferable for the VB.NET programmer if and only if they are 100% certain the code will never be called from C#.
 
For those who choose the second option, the following line in both functions:
(IntPtr)(enable ? 0 : 1 ));
 
should be changed to read:
(IntPtr)(enable ? 1 : 0 ));
 
It is extremely important that the user document whichever approach they choose; the "enable" parameter in the XML comment above the function in the source code file should be changed to indicate either that VB.NET users should reverse the Boolean logic, or that C# users should.
 
-AndrewC
GeneralShield Icon on CommandButtonmemberBYoung@OSIsoft.com13 Mar '08 - 13:04 
I'm using the TaskDialog for asking the user of my app if they want to restart the application to do the requested task because it requires elevated access, similiar to how VS 2008 asks when you try to do something that requires elevated access.
 
For the CommandButton that is for saying "Yes, elevate me", I would like to show the shield icon instead of just the standard green arrow. But I've yet to figure out how. I'm pretty sure it's possible because VS2008 does this, but who knows what VS is doing underneath the hood.
 
Have you tried to do this?
QuestionLicensing QuestionmemberThorsten Dittmar15 Nov '07 - 1:52 
Hi,
 
I'd like to use Vista TaskDialog Wrapper and Emulator (by Hedley Muscroft) in commercial applications and asked him for permission to use his code.
 
While he allowed me to use his code, he also pointed out that his code uses part of your code and suggested that I should double check with you for licensing questions.
 
So: Is there a special license agreement I have to obey when using your code or am I allowed to use and/or modify your code as I need in both free and commercial applications?
 
Thanks for information,
Thorsten
GeneralWrapper and Emulator for pre-VistamemberHedley Muscroft12 Nov '07 - 11:49 
Hi Kevin,
 
Just to let you know, I recently posted an article which builds on your superb project by including an 'emulator' so that the TaskDialog can be used pre-Vista too. I've given you full credit for this excellent article though, and included links to it from my article. I hope that's ok.
 
Thanks again.
 
http://www.codeproject.com/useritems/Vista_TaskDialog_Wrapper.asp
 
Hedley Muscroft

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 5 Jan 2007
Article Copyright 2007 by KevinGre
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid