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]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

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