Feedback

C# - TaskDialog anzeigen

Veröffentlicht von am 29.11.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.
GFU-Schulungen  [Anzeige]

C# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

VB.NET 2017/2015/2013 Einführung

Das Seminar befähigt Sie zur eigenständigen Entwicklung von anwenderorientierten Programmen in VB.NET, worin auch der Einsatz von Datenbanken enthalten ist.

[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 22.05.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!