Feedback

C# - TaskDialog anzeigen

Veröffentlicht von am 11/29/2009
(3 Bewertungen)
Mit Windows Vista wurde der sog. TaskDialog eingeführt, ein Dialogfenster, das jedoch um einiges vielseitiger ist als die alte MessageBox. Die einfache Form des TaskDialogs, die hier implementiert wurde, wird durch die TaskDialog-Funktion in der comctl32.dll (Version 6) bereitgestellt.

Ein Aufruf der API könnte z.B. so aussehen:
TaskDialog taskDialog = new TaskDialog();

taskDialog.Title = "Connection error";
taskDialog.Instruction = "Could not connect to database";
taskDialog.Content = "The connection to your database could not be established. Make sure your db server is running.";

taskDialog.Buttons = TaskDialogButtons.Retry | TaskDialogButtons.Cancel;
taskDialog.Icon = TaskDialogIcon.Error;

taskDialog.Parent = Handle;

TaskDialogResult result = taskDialog.Show();


Soll der TaskDialog modal angezeigt werden sodass während der Dialog geöffnet ist nicht zum Hauptfenster der Anwendung gewechselt werden kann, muss man die Parent-Eigenschaft setzen. Im Normalfall wäre das die Handle-Eigenschaft des aufrufenden WinForms-Formulars.
Unter WPF bekommt man das Handle mittels der WindowInteropHelper-Klasse.

Achtung: WPF-Anwendungen laden standardmäßig nicht die Version 6 der comctl32.dll. Will man in WPF den TaskDialog verwenden, muss man mittels eines Manifestes die richtige Version der DLL laden. Mehr Infos dazu gibts auf http://www.pinvoke.net/default.aspx/comctl32/TaskDialog.html.
[Flags]
public enum TaskDialogButtons
{
    None = 0x0,
    OK = 0x1,
    Yes = 0x2,
    No = 0x4,
    Cancel = 0x8,
    Retry = 0x10,
    Close = 0x20
}

public enum TaskDialogIcon
{
    None = 0x0,
    Warning = 0xFFFF,
    Error = 0xFFFE,
    Information = 0xFFFD,
    Shield = 0xFFFC,
}

public enum TaskDialogResult
{
    None = 0x0,
    OK = 0x1,
    Cancel = 0x2,
    Retry = 0x4,
    Yes = 0x6,
    No = 0x7,
    Close = 0x8
}

public class TaskDialog
{
    [DllImport("comctl32.dll", CharSet = CharSet.Unicode, EntryPoint = "TaskDialog")]
    private static extern int ShowTaskDialog(IntPtr hWndParent, IntPtr hInstance, string pszWindowTitle, string pszMainInstruction, string pszContent, int dwCommonButtons, IntPtr pszIcon, out int pnButton);

    public string Title { get; set; }
    public string Instruction { get; set; }
    public string Content { get; set; }

    public TaskDialogButtons Buttons { get; set; }
    public TaskDialogIcon Icon { get; set; }

    public IntPtr Parent { get; set; }

    public static TaskDialogResult Show(string content)
    {
        return Show(string.Empty, string.Empty, content);
    }

    public static TaskDialogResult Show(string title, string instruction, string content)
    {
        return Show(title, instruction, content, TaskDialogButtons.OK);
    }

    public static TaskDialogResult Show(string title, string instruction, string content, TaskDialogButtons buttons)
    {
        return Show(title, instruction, content, buttons, TaskDialogIcon.None);
    }

    public static TaskDialogResult Show(string title, string instruction, string content, TaskDialogButtons buttons, TaskDialogIcon icon)
    {
        return Show(title, instruction, content, buttons, icon);
    }

    public static TaskDialogResult Show(string title, string instruction, string content, TaskDialogButtons buttons, TaskDialogIcon icon, IntPtr parent)
    {
        int result;

        ShowTaskDialog(parent, IntPtr.Zero, title, instruction, content, (int)buttons, new IntPtr((int)icon), out result);

        return (TaskDialogResult)result;
    }

    public TaskDialogResult Show()
    {
        return Show(Title, Instruction, Content, Buttons, Icon, Parent);
    }
}
Abgelegt unter TaskDialog, MessageBox, Dialog, WPF.

1 Kommentare zum Snippet

phi1010 schrieb am 5/22/2011:

public static TaskDialogResult Show(string title, string instruction, string content, TaskDialogButtons buttons, TaskDialogIcon icon)
{
return Show(title, instruction, content, buttons, icon);
}

verursacht eine Endlosschleife und damit eine System.StackOverflowException.
 

Logge dich ein, um hier zu kommentieren!