Gastposting von Oliver Scheer, Developer Evangelist - Windows, Silverlight und UI-Technologien bei der Microsoft Deutschland GmbH.

DSCF0103Nur noch 22 Tage bis zum Windows 7 Launch.

Heute befassen wir uns mit einem nicht ganz so neuen, aber trotzdem recht spannenden Thema. Die folgenden Funktionalitäten gibt bereits in Windows Vista, wo sie allerdings nahezu unentdeckt geblieben sind: die anpassbaren Dialoge. Mit dem Windows SDK wird schon seit einer Weile eine kleine Beispielbibliothek vertrieben, die den Zugriff auf die neuen Dialog-Funktionen ermöglichte – die Windows Vista Bridge für Managed Code.

Der Gedanke der Vista Bridge wurde im Windows API Code Pack (Link) weitergeführt und über noch übersichtlichere Klassen zur Verfügung gestellt.

Warum stellt Windows eigentlich neue Standarddialoge zur Verfügung bzw. erweitert diese?

Das ist sehr einfach erklärt: Der Benutzer soll nicht durch unzählige, unterschiedlich aussehende Dialoge irritiert werden. Jeder Benutzer gewöhnt sich an ein gewisses Aussehen und eine gewisse Funktionsweise von Anwendungen, ebenso verhält es sich bei den Dialogen. Wenn der User bestimmte Symbole sieht, assoziiert er damit eine gewisse Informationsart. Zwar kann jeder Entwickler beliebige Dialoge erstellen und damit seinen Benutzer informieren (bzw. verwirren), aber ich bitte sie, für normale Meldungen einfach die „gebräuchlichen“ Dialoge zu verwenden. Dadurch hat der Benutzer einen gewissen Wiedererkennungseffekt und damit eine leichtere Bedienung.

Was wird benötigt, um auf die Dialoge zuzugreifen?

Es reicht, wenn man sich aus dem Windows API Code Pack die Core-Bibliothek einbindet. Diese enthält den Namensraum „TaskDialog“ und beinhaltet sämtliche Funktionalitäten rund um den Standarddialog.

Die einfachste Form, einen Dialog zu öffnen und das Ergebnis abzufragen, ist:

TaskDialog td = new TaskDialog();
td.Caption = "Hallo Welt";
td.Text = "Windows 7 ist super";
td.Show();

Das Ergebnis:

clip_image002

Damit wird allerdings noch nicht abgefragt, welche Schaltfläche gedrückt wurde. Ist in diesem Beispiel auch nicht nötig, da nur die OK-Schaltfläche zu sehen ist.

Möchte man den Benutzer ordentlich fragen, ob er die Anwendung wirklich beenden will, und ihn darauf hinweisen, dass die Änderungen an seinen Daten nicht gespeichert werden, sollte der Quellcode folgend aussehen:

TaskDialog td = new TaskDialog();
td.Icon = TaskDialogStandardIcon.Information;
td.StandardButtons =
TaskDialogStandardButtons.Yes |
TaskDialogStandardButtons.No;
td.Caption = "Frage";
td.InstructionText = "Wollen sie die Anwendung wirklich beenden?";
td.Text = "Änderungen werden nicht gespeichert";
if (td.Show() == TaskDialogResult.Yes)
{
// Anwendungen beenden
}

Das Ergebnis:

clip_image004

Die Methode Show() liefert zurück, welche Schaltfläche gedrückt wurde. Dadurch erhält man ein einfaches Feedback der Benutzereingabe.

Welche Konfigurationsmöglichkeiten bietet der „neue“ Standard-Dialog?

Symbole sagen mehr als 1000 Worte. Wenn ein Benutzer ein rotes Ausrufezeichen sieht, sollte er ahnen können, dass etwas nicht in Ordnung ist. An der Ampel im Straßenverkehr ist dies ähnlich oder fahren sie bei Rot einfach los? Ich hoffe nicht.

Welche Schaltflächen können verwendet werden?

clip_image006

Achtung: Dieser Dialog ist nur ein Beispiel für die unterschiedlichen Buttons. Nicht alles, was möglich ist, sollte auch gemacht werden. Oder wüssten sie jetzt, welcher Button sie zum Ziel führt? Auf eine Schaltfläche „Vielleicht“ wurde bewusst verzichtet.

Wem diese Auswahl an Buttons nicht genügt, kann auch eigene Buttons einfügen. Einziger Nachteil bei angepassten Schaltflächen ist, dass sie für eine Internationalisierung selber sorgen müssen. Im Gegensatz zu den Standard-Schaltflächen werden diese nicht automatisch in anderen Sprachen dargestellt.

Administratorrechte anfordern

Wichtige Systemänderungen dürfen nur von Personen durchgeführt werden, die administrative Rechte haben. Dadurch wird vermieden, dass Benutzer willkürlich ihr System verändern können und damit die Stabilität und Sicherheit des Systems gefährden.

clip_image008

Aufgaben, die solche Rechte benötigen, sollten auch auf der Oberfläche als solches gekennzeichnet sein. Windows weist auf alle administrativen Funktionen durch ein „Schutzschild“ hin. Verwenden sie dieses bitte auch, damit ein gewisser Wiedererkennungseffekt erhalten bleibt. Die Implementierung des Schildes ist sehr einfach:

tdElevation = new TaskDialog();
tdElevation.Cancelable = true;
tdElevation.InstructionText = "Elevated task example";
TaskDialogCommandLink adminTaskButton = new TaskDialogCommandLink("adminTaskButton", "Adming stuff", "Run some admin tasks");
adminTaskButton.ShowElevationIcon = true;
adminTaskButton.Click += new EventHandler(adminTaskButton_Click);
adminTaskButton.Default = true;
tdElevation.Controls.Add(adminTaskButton);
tdElevation.Show();

Wenn man schon Fehler macht, dann bitte mit Stil

Keiner macht sie gern, aber ab und an kommen sie dann doch vor, und sie sind ja auch menschlich: Fehler. Aber aus Fehlern lernt man schließlich am meisten. Bitten sie doch einfach ihre Benutzer, ihnen die Fehlermeldungen und Feedback zurückzuschicken. Die Fehlermeldung kann ihnen dabei helfen, ihre Anwendung weiter zu verbessern.

Der folgende Dialog ist die Luxusvariante einer Fehlermeldung. Diese wirkt auf jeden Fall besser, als ein reiner Programmabsturz.

clip_image010

Der Code für die Implementierung sieht wie folgt aus:

tdError = new TaskDialog();
tdError.DetailsExpanded = false;
tdError.Cancelable = true;
tdError.Icon = TaskDialogStandardIcon.Error;

tdError.Caption = "Error Sample 1";

tdError.InstructionText = "An unexpected error occured. Please send feedback now!";
tdError.Text = "Error message goes here…";
tdError.DetailsExpandedLabel = "Hide details";

tdError.DetailsCollapsedLabel = "Show details";
tdError.DetailsExpandedText = "Stack trace goes here…";
tdError.FooterCheckBoxChecked = true;
tdError.FooterCheckBoxText = "Don’t ask me again";
tdError.ExpansionMode = TaskDialogExpandedDetailsLocation.ExpandFooter;
TaskDialogCommandLink sendButton = new TaskDialogCommandLink("sendButton", "Send Feedback\nI’m in a giving mood");
sendButton.Click += new EventHandler(sendButton_Click);
TaskDialogCommandLink dontSendButton = new TaskDialogCommandLink("dontSendButton", "No Thanks\nI don’t feel like being helpful");
dontSendButton.Click += new EventHandler(dontSendButton_Click);
tdError.Controls.Add(sendButton);
tdError.Controls.Add(dontSendButton);
tdError.Show();

Diverse Studien haben ergeben, dass vor dem Bildschirm wartende Benutzer, diein dieser Zeit unterhalten werden, die Zeit als wesentlich kürzer empfinden, als ohne Unterhaltung. Daher mein Tipp: Unterhalten sie den Benutzer mit „Fortschrittsbalken“! Dadurch weiß er, dass die Anwendung noch läuft, aber gerade beschäftigt ist.

clip_image012

Das Video des Tages

Get Microsoft Silverlight