Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 14 Min.

Design mit WinUI 3

Das Erscheinungsbild einer App wird wesentlich durch Farben, Materialien, Kontrast und Animationen bestimmt. WinUI 3 setzt dabei umfassend auf das Fluent Design.
© dotnetpro
Farben, Schriftarten, Materialien und Animation spielen eine entscheidende Rolle bei der Gestaltung der Benutzeroberfläche einer Software. Sie sind Teil des Designs und sind unter anderem auch für eine hohe Wiedererkennungsrate entscheidend.Eine gut gemachte Benutzeroberfläche der Anwendung sollte konsistent sein und einen hohen Wiedererkennungswert aufweisen. Beispielsweise kann die Zugehörigkeit von mehreren Anwendungen zu einer Softwarefamilie auf diese Weise kenntlich gemacht werden. Ein Musterbeispiel hierfür ist die Gestaltung der Office-Apps und ähnlicher Büro-Applikationen von Microsoft. Microsoft Word und One Note zum Beispiel weisen eine nahezu identische Anordnung der Menü­elemente auf (Bild 1). Auch das Styling der Apps mit Farben, Schriftarten und dergleichen ist identisch (siehe auch den Kasten Corporate Design).
Corporate Design der Office-Apps von Microsoft (Bild 1) © Autor
Auf diese Weise stellt man sicher, dass sich die Anwender mit der Bedienung der Apps stets vertraut fühlen und somit das Nutzererlebnis als positiv empfunden wird.Es stellen sich aus unserer Sicht mehrere Fragen:
  • Wie kann man dieses Ziel bei der Gestaltung des User Interfaces einer Applikation erreichen?
  • Wie stellt man sicher, dass ein Softwaresystem umfassende und durchgehende Wiedererkennungsmerkmale aufweist?
  • Wie arbeiten wir mit Farben und Symbolen?
Anregungen in Bezug auf die Gestaltung von modernen Windows-Desktop-Applikationen mit dem Grafikframework Win­UI 3 liefert dieser Artikel.An einer Anwendung arbeitet üblicherweise ein interdisziplinäres Team aus Designern und Entwicklern. Um eine reibungslose Kommunikation zwischen den Beteiligten sicherzustellen, ist eine gute und präzise Dokumentation erforderlich. Um alle Informationen auf einen Blick in Form einer durchgehenden Dokumentation zu haben, ist die Verwendung und Pflege eines Design-Systems geeignet.Ein Design-System ist eine Sammlung von Richtlinien, Regeln, Komponenten und Ressourcen, die zur Gestaltung und Entwicklung konsistenter und ansprechender Benutzeroberflächen verwendet werden. Es dient dazu, die visuelle Gestaltung, das Branding und die Interaktionselemente einer Anwendung beziehungsweise eines Produkts zu standardisieren. Ein Design-System umfasst in der Regel verschiedene Komponenten, wie Farbpaletten, Schriftarten, Symbole, User-Interface-Elemente, Layouts und Gestaltungsmuster. Es bietet klare Richtlinien für das visuelle Erscheinungsbild und die Interaktionen, um sicherzustellen, dass alle Teile einer Anwendung oder eines Produkts konsistent und zusammenhängend wirken. Ein Design-System fördert die Konsistenz und Einheitlichkeit, erleichtert die Zusammenarbeit zwischen Designern und Entwicklern, beschleunigt den Designprozess, ermöglicht eine effiziente Wartung und Skalierung von Produkten und verbessert letztendlich die Benutzererfahrung. Es dient als zentrale Ressource für das Designteam, um sicherzustellen, dass alle Mitglieder konsistent arbeiten und die Designrichtlinien einhalten.Es gibt verschiedene Frameworks und Tools, die bei der Erstellung und Verwaltung von Design-Systemen helfen, wie zum Beispiel Sketch, Figma, Adobe XD und InVision.

Design-System unter der Lupe

Ein Design-System besteht aus verschiedenen Elementen, die zusammenwirken, um eine konsistente Gestaltung und Benutzererfahrung zu gewährleisten. Die Designprinzipien beschreiben die grundlegenden Richtlinien, die den Designprozess leiten und die Werte und Ziele des Unternehmens oder der Organisation widerspiegeln. Sie dienen als Grundlage für alle gestalterischen Entscheidungen. Wichtige Bestandteile eines Design-Systems sind:
  • User-Interface-Komponenten: Das Design-System definiert eine Sammlung von wiederverwendbaren UI-Komponenten wie Buttons, Formularen, Navigationsleisten, Karten, Tabellen und anderen UI-Elementen. Diese Komponenten sind so gestaltet, dass sie einheitlich aussehen und sich konsistent verhalten.
  • Layout-System: Ein Design-System legt auch Richtlinien für das Layout fest. Es definiert etwa die Rasterstruktur, das Seitenlayout und die Abstände zwischen den Elementen.
  • Interaktionsmuster: Es enthält häufig Richtlinien für Interaktionsmuster und Animationen. Es definiert beispielsweise, auf welche Weise Benutzerinteraktionen wie
    Klicks, Schieberegler oder Drop-down-Elemente gestaltet werden sollen, um eine konsistente Benutzererfahrung zu gewährleisten.
  • Branding-Elemente: Ein Design-System enthält oft Branding-Elemente wie Logo, Farbpalette, Schriftarten und visuelle Stile. Diese Elemente tragen zur Wiedererkennung und Konsistenz der Marke bei.
Beispiele und Best Practices zur Verwendung des Design-Systems sollten in dessen Dokumentation enthalten sein. Das Gesamtsystem sollte kontinuierlich gepflegt, weiterentwickelt und verbessert werden. Daher beinhaltet es auch eine Versionierung und einen Aktualisierungsprozess, um sicherzustellen, dass alle Teammitglieder Zugriff auf die neueste Version haben und Änderungen nachverfolgen können.Ein Design-System ist damit die Zusammenfassung aus verschiedenen Einzelelementen (Bild 2):
Typische Bestandteile eines Design-Systems (Bild 2) © Autor
  • Governance: Es sind die Richtlinien und die Philosophie, die das Design bestimmen. Es wird erklärt, warum Komponenten auf eine bestimmte Weise verwendet werden.
  • Style Guidelines: Sie legen die Standards für das Branding und Design des Produkts fest, beispielsweise Icons, Typografie und eine Farbpalette.
  • Pattern Library: Hier wird jedes einzelne UI-Element des Produkts erfasst, sodass es schnell abgerufen und wiederverwendet werden kann. Verwandte Elemente werden oft kombiniert und als Layouts dargestellt.
Die populärsten Design-Systeme sind:
  • Material Design von Google
  • Polaris von Shopify
  • Fluent von Microsoft
  • Human Design von Apple
  • Primer von GitHub
  • Carbon von IBM
  • Monument von Cisco
  • Sipgate
  • Atlassian
Jedes Betriebssystem hat sein vom Hersteller bevorzugtes Design-System, beispielsweise verwendet Android Material Design, und die Gestaltung von Windows basiert auf dem Fluent-Design-Ansatz. In Webapplikationen können grundsätzlich alle Design-Systeme unabhängig vom Betriebssystem angewendet werden, da die Apps auf unterschiedlichen Systemen ausgeführt werden.Es ist auch möglich, dass man ein anderes Design-System für Anwendungen auf einem Betriebssystem anwendet, als dieses empfiehlt. Beispielsweise kann man Apps für Windows auch auf der Basis des Material Designs von Google gestalten. Betrachtet man die Webseite des Fluent-Design-Systems [1], dann findet man neben Umsetzungshinweisen für Windows auch entsprechende Ressourcen für iOS und die Web-Bibliothek React.Ob es sinnvoll ist, bei der Gestaltung einer Anwendung ein anderes Design-System anzuwenden als dasjenige des Betriebssystems, lässt sich nur im Einzelfall entscheiden. Meist wirken die Apps dann weniger gut in das Gesamtsystem integriert. Gleichwohl kann es sinnvoll sein, eine App auf allen Zielsystemen mit einem identischen Erscheinungsbild zu gestalten.Mit dem Grafikframework WinUI 3 erstellen wir ausschließlich Apps für den Windows-Desktop. Maßgebend sind daher die Designrichtlinien von Windows, die wiederum das Fluent-Design-System umsetzen. Dieses System steht daher im Mittelpunkt der nachfolgenden Ausführungen. Einen intensiven Blick werfen wir dabei auf die farbliche Gestaltung, die Typografie und Ikonografie.

Fluent Design 2

Das Betriebssystem Windows 11 und die daraus aufgeführten Apps sollen sich in Fragen der Gestaltung an der Designsprache Fluent Design orientieren. Das neueste Grafikframework WinUI 3 basiert auf Fluent Design. WinUI 3 wurde als eigenständige Bibliothek entwickelt und kann mit verschiedenen anderen User-Interface-Technologien wie Windows Forms und der Windows Presentation Foundation kombiniert werden. In WinUI 3 können Fluent-Design-Elemente und -Effekte realisiert werden.Im Jahr 2023 hat Microsoft das Fluent Design Version 2 vorgestellt. Das neue Design-System basiert auf dem Vorgänger Fluent Design 1 und zielt auf die Verbesserung der Zusammenarbeit und auf die Förderung der Kreativität während des gesamten Entwicklungsprozesses ab.Zu den wichtigen Aktualisierungen von Fluent Design in Version 2 ge­hören unter anderem ein kohärenteres Farbsystem, ein Token-System, standardisierte Ecken, eine bessere Anpassbarkeit, robustere Nutzungshinweise und eine Notation für Barrierefreiheit.Sehen wir uns das etwas genauer an: Das Token-System ist ein bemer­kenswertes Merkmal des Fluent-2-Design-Systems. Design-Token sind gespeicherte Werte, die zum Zuweisen von Fluent-Stilen wie Farbe, Typografie, Abstand oder Höhe verwendet werden, ohne dass Pixel und Hexadezimalcodes fest codiert werden müssen. Das Token-System ermöglicht es, dass sich Entwickler und Designer besser austauschen können und auf diese Weise ein konsistentes Design über Plattformen möglich wird.Insgesamt umfasst die Design Language von Fluent Design 2 folgende Elemente: Farbe, Hervorhebung, Ikonografie, Layout, Material, Motion, Formen und Typografie.Sehen wir uns nun ausgewählte Aspekte aus diesem Bereich an. Wir wollen mit den Farben starten. Das Ziel: Alles soll knallbunt werden – na ja, lieber nicht, das war nur Spaß!

Farben

Die Wahl der Farbe ist ein wichtiges Instrument bei der Gestaltung von Oberflächen. Eine gezielte Verwendung von Farben unterstützt bei der Übermittlung von Inhalten und hilft dabei, Emotionen zu kommunizieren. Passend ausgewählte Farben sorgen dafür, dass sich die Verwendung der Software für die Nutzer vertraut anfühlt. Das Fluent-System definiert drei Farbpaletten [1]:
  • Neutral Colors: Die neutrale Farbpalette besteht aus Schwarz, Weiß und Grautönen. Diese Farben werden für Oberflächen, Texte und Layout-Elemente verwendet. Hellere Neutraltöne werden verwendet, um Schwerpunktbereiche in der Oberfläche hervorzuheben und ein Gefühl der Hierarchie zu erzeugen. So versucht man, den Blick einer Person auf bestimmte Bereiche einer Benutzeroberfläche zu lenken (Bild 3).
Neutrale Farben und visuelle Hierarchie (Bild 3) © Autor
  • Shared Colors: Diese Farben findet man in übergreifenden und wiederverwendbaren Komponenten wie Avataren und bei Kalenderdarstellungen. Shared-Farben ermöglichen ­eine schnelle Erkennung von Komponenten und Funktionen von bekannten Produkten (Bild 4).
Shared Colors im Überblick (Bild 4) © Autor
  • Semantic Colors: Semantische Farben werden verwendet, um wichtige Informationen zu vermitteln, beispielsweise zur Kommunikation von Feedback, Status oder Dringlichkeit. Achtung: Man sollte diese Farben nicht zu dekorativen Designzwecken einsetzen (Bild 5).
Semantic Colors im Überblick (Bild 5) © Autor
  • Brand Colors: Die Produkte in Microsoft 365 zeichnen sich beispielsweise durch den Einsatz spezieller Markenfarben aus (Bild 6). Ein ähnliches Konzept kann man auf die eigene App übertragen. Man sollte es meiden, Markenfarben übermäßig einzusetzen oder diese auf großen Flächen zu verwenden.
Brand Colors im Überblick (Bild 6) © Autor
Die Fluent-Farbpaletten werden auch häufig verwendet, um Interaktionszustände von Komponenten anzuzeigen. Eine Komponente wird dunkler, wenn jemand mit ihr interagiert. Man kann zwischen folgenden Zuständen unterscheiden: vom hellsten Ruhezustand über einen dunkleren Schwebezustand bis hin zum dunkelsten ausgewählten Zustand. Bei Erlangen des Fokus ändert sich die Farbe des Steuerelements nicht, aber der Container erhält einen dickeren Strich, um ­eine klare visuelle Unterscheidung zwischen Maus- und Tastaturinteraktionen zu schaffen (Bild 7). Mit dieser feingranularen Abstufung des Fluent-Design-Systems unterstützt man als Designer beziehungsweise Entwickler die Bedienung der App. Man gibt jederzeit Feedback über den Status eines Objekts. Die Nutzer lernen dieses visuelle Feedback zu deuten und werden eine Wiedererkennung in einer anderen App positiv werten.
Interaction State im Überblick (Bild 7) © Autor

Accessibility

Accessibility steht bei Fragen des Designs für Zugänglichkeit beziehungsweise Barrierefreiheit. Man sollte beispielsweise bei der Auswahl der Farben stets darauf achten, welche Kontrastwerte die Oberfläche aufweist. Personen mit Sehbehinderung oder Farbenblindheit können nicht alle Farbkombinationen vernünftig wahrnehmen. Außerdem sollten Farben nicht als einzige Kommunikationsmöglichkeit genutzt werden. Idealerweise bilden Texte, Grafiken (Symbole) und Farben ein abgestimmtes System und adressieren damit auf vielfältige Art und Weise die Nutzer einer Anwendung (siehe den Kasten Mehrfachcodierung).
Listing 2: Experimente mit Akzentfarben
<span class="xml"><span class="hljs-tag"><<span class="hljs-name">Window</span> <span class="hljs-attr">x:Class</span>=<span class="hljs-string">"App1.MainWindow"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://schemas.microsoft.com/winfx/2006/xaml/</span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> presentation"</span> <span class="hljs-attr">xmlns:x</span>=<span class="hljs-string">"http://schemas.microsoft.com/winfx/2006/</span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> xaml"</span> <span class="hljs-attr">xmlns:d</span>=<span class="hljs-string">"http://schemas.microsoft.com/expression/</span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> blend/2008"</span> <span class="hljs-attr">xmlns:local</span>=<span class="hljs-string">"using:App1"</span> <span class="hljs-attr">xmlns:mc</span>=<span class="hljs-string">"http://schemas.openxmlformats.org/</span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> markup-compatibility/2006"</span> <span class="hljs-attr">mc:Ignorable</span>=<span class="hljs-string">"d"</span>></span> <span class="hljs-tag"><<span class="hljs-name">StackPanel</span> <span class="hljs-attr">Margin</span>=<span class="hljs-string">"100"</span>></span> <span class="hljs-tag"><<span class="hljs-name">StackPanel.Resources</span>></span> <span class="hljs-tag"><<span class="hljs-name">Style</span> <span class="hljs-attr">x:Name</span>=<span class="hljs-string">"RectangleStyle"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">TargetType</span>=<span class="hljs-string">"Rectangle"</span>></span><span class="xml"> <span class="hljs-tag"><<span class="hljs-name">Setter</span> <span class="hljs-attr">Property</span>=<span class="hljs-string">"Width"</span> <span class="hljs-attr">Value</span>=<span class="hljs-string">"200"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Setter</span> <span class="hljs-attr">Property</span>=<span class="hljs-string">"Height"</span> <span class="hljs-attr">Value</span>=<span class="hljs-string">"40"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Setter</span> <span class="hljs-attr">Property</span>=<span class="hljs-string">"Margin"</span> <span class="hljs-attr">Value</span>=<span class="hljs-string">"0,20"</span> /></span> </span><span class="hljs-tag"></<span class="hljs-name">Style</span>></span> <span class="hljs-tag"></<span class="hljs-name">StackPanel.Resources</span>></span> <span class="hljs-tag"><<span class="hljs-name">Rectangle</span> <span class="hljs-attr">Fill</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{ThemeResource </span><br/><span class="hljs-template-variable"> SystemAccentColorLight3}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Style</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{StaticResource RectangleStyle}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Rectangle</span> <span class="hljs-attr">Fill</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{ThemeResource </span><br/><span class="hljs-template-variable"> SystemAccentColorLight2}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Style</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{StaticResource RectangleStyle}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Rectangle</span> <span class="hljs-attr">Fill</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{ThemeResource </span><br/><span class="hljs-template-variable"> SystemAccentColorLight1}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Style</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{StaticResource RectangleStyle}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Rectangle</span> <span class="hljs-attr">Fill</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{ThemeResource </span><br/><span class="hljs-template-variable"> SystemAccentColor}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Style</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{StaticResource RectangleStyle}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Rectangle</span> <span class="hljs-attr">Fill</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{ThemeResource </span><br/><span class="hljs-template-variable"> SystemAccentColorDark1}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Style</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{StaticResource RectangleStyle}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Rectangle</span> <span class="hljs-attr">Fill</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{ThemeResource </span><br/><span class="hljs-template-variable"> SystemAccentColorDark2}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Style</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{StaticResource RectangleStyle}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Rectangle</span> <span class="hljs-attr">Fill</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{ThemeResource </span><br/><span class="hljs-template-variable"> SystemAccentColorDark3}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Style</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{StaticResource RectangleStyle}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">StackPanel</span>></span><span class="hljs-tag"></<span class="hljs-name">Window</span>></span></span> 

Visuelle Effekte

Auch Hervorhebungen sind ein wichtiges Instrument bei der Gestaltung von Oberflächen. Diese nutzen das Zusammenspiel von Schatten und Licht. Es geht dabei um die visuelle Gestaltung des Abstands zwischen einem Objekt und der Oberfläche dahinter, der durch den gezielten Einsatz von Schatten und Licht erzielt wird. Das Hervorheben von Elementen vermittelt die Bedeutung dieser Elemente auf der ­Benutzeroberfläche und verbessert die Übersichtlichkeit. ­Dadurch entstehen eine klare Hierarchie und ein Gefühl der Fokussierung. Die Benutzererfahrung wird verbessert. Die Schattenrichtung vermittelt die wahrgenommene Lichtquelle und die Schattengröße zeigt die Entfernung des Betrachters vom Objekt. Scharfe und klare Schatten weisen auf eine Nähe zur Oberfläche hin, während größere, weichere Schatten auf eine größere Entfernung hindeuten.Die Werte sind im Schatten-System festgelegt (Bild 8). Mehr über Hervorhebungen und die Verwendung von Schatten findet man unter [2]. Man sollte sogenannte Schatten-Token verwenden, um konsistente Schatten auf allen Oberflächen (Dialogfelder, Fenster) sicherzustellen.
Schatten-System in Fluent 2 (Bild 8) © Autor
Kommen wir zu den Symbolen als weitere wichtige Elemente der Gestaltung des User Interfaces. Symbole sollte man derart gestalten, dass diese stets erkennbar, funktional und leicht verständlich sind. Die Symbole des Fluent-2-Design-Systems sind in drei Kategorien unterteilt (Bild 9):
Überblick über die System-, Produkt- und Dateisymbole (Bild 9) © Autor
  • Systemsymbole: Diese Symbole verwendet man für Elemente wie Befehlsleisten, Navigation oder Statusanzeigen. Systemsymbole werden unter einer Open-Source-Lizenz bereitgestellt und können in den eigenen Apps frei eingesetzt werden.
  • Produktsymbole: Diese Symbole repräsentieren im Beispiel die Apps von Microsoft. Die App benötigt eigene Produktsymbole, die man sorgfältig entwerfen sollte.
  • Dateisymbole: Sie weisen auf bestimmte Dateien oder Dateiformate hin.
Eine Sammlung von Fluent-Icons und deren Nutzung findet man unter [3] und [4].Formen tragen dazu bei, die Benutzeroberfläche ansprechender zu gestalten. Das Ziel ist es, dass die Nutzer die Bedeutung der Symbole einfacher verarbeiten und auf einen Blick die Bedeutung erfassen können. Mit anderen Worten: Stellen Sie die Anwender nicht vor Rätsel. Die vier Grundformen beim Design von Windows-Anwendungen sind (vergleiche auch Bild 10):
Die Formen im Überblick (Bild 10) © Autor
  • Rechteck
  • Kreis
  • Pill
  • Beak
Diese Grundformen dienen der Gestaltung der Controls für die Benutzeroberfläche. Grundsätzlich werden bei aktuellen Windows-Anwendungen abgerundete Formen verwendet. Standardmäßig betragen die Eckradien von Rechteckformen 4 Pixel. Bei Formen kleiner als 32 Pixel wird der Eckwinkel auf 2 Pixel reduziert. Für große Elemente werden 8-Pixel- und 12-Pixel-Winkel verwendet. Es gibt Fälle, in denen die Ecken nicht abgerundet werden, weil dadurch unangenehme Lücken entstehen würden, beispielsweise wenn zwei abgerundete Komponenten Kante an Kante nebeneinander platziert werden. Für die Beschriftung wird standardmäßig die Schriftart Segoe verwendet. Varianten der Schriftart Segoe werden in nativen Apps für das Betriebssystem Windows und in Web-Apps verwendet, welche primär unter Windows ausgeführt werden. Die Designrichtlinien geben vor, welche Größe und Stärke der Schrift­arten anzuwenden ist.

Praxis

Viele Leser werden sich nun fragen, wie man diese Erkenntnisse bei der App-Entwicklung konkret realisiert. Als WinUI-3-Entwickler ist man hier automatisch auf dem richtigen Pfad. Die Logik des Systems und die WinUI-3-Controls unterstützen von Haus aus vieles automatisch. Wir sehen uns jetzt einige ausgewählte Aspekte in der Umsetzung an.Erstellen Sie eine neue WinUI-3-App und experimentieren Sie mit uns. Beginnen wir mit der farblichen Gestaltung. Wird die App gestartet, dann übernimmt sie das Design des Betriebssystems, das heißt entweder ein helles oder ein dunkles Thema. Sie können das Thema auch initial für die App einstellen. Das erfolgt in der Datei App.xaml über das Setzen der Eigenschaft RequestedTheme, beispielsweise auf den Wert RequestedTheme=“Dark“ (Listing 1). Viele Apps bieten in den Einstellungen die Auswahl des Themas (Hell, Dunkel und System). Ein Beispiel für diese Systemeinstellungen zeigtBild 11. Auf jeden Fall sollten Sie Ihre App sowohl unter hellem als auch unter dunklem Design testen, um sicherzustellen, dass sie unter allen Bedingungen lesbar ist.
Wechsel des Themas in den App-Einstellungen (Bild 11) © Autor
Möchten Sie die Farbwerte von einzelnen Elementen anpassen, dann haben Sie grundsätzlich zwei Optionen:
  • Hartcodierte Farbwerte: Hier geben Sie direkt einen Farbwert vor. Das Vorgehen ist beispielsweise dann angebracht, wenn Sie die Farbwerte an die Vorgaben eines Corporate Designs des Unternehmens anpassen möchten. Diese Definition der Farbwerte kann Schwierigkeiten bei bestimmten Themen (Hell, Dunkel, Angepasst) des Betriebssystems verursachen und auch Einschränkungen für Benutzer mit Sehschwächen bedeuten.
  • Verwenden von Designpinseln: Das sind vordefinierte Farbwerte, die sich automatisch an das vom Betriebssystem vorgegebene Thema anpassen.
Betrachten wir die Arbeitsweise mit Designpinseln genauer. Statt eines hartcodierten Farbwerts erfolgt die Farbangabe beispielsweise für ein TextBlock-Element wie folgt:

&lt;TextBlock <span class="hljs-built_in">Text</span><span class="hljs-string">"..."</span> Foreground=<span class="hljs-string">"{</span>
<span class="hljs-string">  ThemeResource TextFillColorPrimaryBrush}"</span> /&gt; 
Sehen wir uns an, wie der Farbwert für diesen Pinsel zur Laufzeit bestimmt wird. In den Ressourcenverzeichnissen Light und Dark wird dieser Pinsel wie folgt definiert:

<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">SolidColorBrush</span> <span class="hljs-attr">x:Key</span>=<span class="hljs-string">"TextFillColorPrimaryBrush"</span> </span></span>
<span class="xml"><span class="hljs-tag">  <span class="hljs-attr">Color</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{StaticResource TextFillColorPrimary}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>/&gt;</span></span> 
Im Ressourcenverzeichnis HighContrast wird dieser Pinsel hingegen so definiert:

<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">SolidColorBrush</span> <span class="hljs-attr">x:Key</span>=<span class="hljs-string">"TextFillColorPrimaryBrush"</span> </span></span>
<span class="xml"><span class="hljs-tag">  <span class="hljs-attr">Color</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{ThemeResource SystemColorWindowTextColor}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>/&gt;</span></span> 
Wenn dieser Pinsel auf ein XAML-Element angewendet wird, wird die Farbe zur Laufzeit durch das aktuelle Design bestimmt. Konkret sind es dann die folgenden Farbwerte:
  • DesignHell: Farbressource: TextFillColorPrimary, Farbwert: #E4000000,
  • Design Dunkel: Farbressource: TextFillColorPrimary, Farbwert: #FFFFFFFF,
  • Design HighContrast: Farbressource: SystemColorWindowTextColor, Farbwert: die individuelle Farbe, die in den Einstellungen für Text angegeben ist.
Grundsätzlich gilt: Obwohl es möglich ist, die Systemfarbressourcen zu überschreiben, empfiehlt es sich, die Farbauswahl des Benutzers zu respektieren, insbesondere bei Kontrasteinstellungen.Kommen wir an dieser Stelle zum Thema Kontrast. Dieser Wert ist besonders für Benutzer mit Sehbeeinträchtigungen und bei Verwendung der Apps in Umgebungen mit nicht optimalen Lichtverhältnissen von Bedeutung. Immer dann, wenn Sie benutzerdefinierte Farbwerte vorgeben, müssen Sie auf die Kontrastwerte achten. Um die Wirkung von Farben zu bestimmen, können Sie das Farbauswahltool in den Windows-Einstellungen verwenden (Bild 12). Microsoft verweist in diesem Zusammenhang auf die Ressourcen des W3C-Konsortiums [5], um die Kontrastwerte zu bestimmen. Man findet dort Formeln und Verweise auf Tools. Für unsere Begriffe ist dies etwas zu kompliziert, wenn man sich mit der Farbenlehre nicht wirklich auskennt. Etwas einfacher geht es, wenn man die App WinUI 3 Gallery aus dem Windows App Store installiert und verwendet. Hier können Sie im Bereich Color contrast das Kontrastverhältnis von Vorder- und Hintergrundfarbe experimentell bestimmen und gleichzeitig die Wirkung begutachten. Sie bekommen ebenfalls Hinweise, bis zu welcher Schriftgröße eine Farbkombination noch als gut lesbar bezüglich des Kontrastverhältnisses gilt (Bild 13).
Color-contrast-Tool in der App WinUI 3 Gallery (Bild 13) © Autor
Farbauswahl in den Windows-Einstellungen (Bild 12) © Autor
Schließen wir noch ein Experiment mit den Akzentfarben an. Ein Akzentfarbalgorithmus in der Windows-Shell generiert helle und dunkle Schattierungen der Akzentfarbe. Diese Schattierungen sind als Designressourcen verfügbar:
  • SystemAccentColorLight3
  • SystemAccentColorLight2
  • SystemAccentColorLight1
  • SystemAccentColorDark1
  • SystemAccentColorDark2
  • SystemAccentColorDark3
Erstellen wir eine einfache Oberfläche mit einigen Rechtecken (Listing 2). Den Rechtecken weisen wir die genannten Konstanten für die Werte der Akzentfarben zu. Starten Sie die App, und Sie werden entsprechende Farbabstufungen für die Rechtecke vorfinden. Wechseln Sie die Akzentfarbe in den Windows-Einstellungen und starten Sie die App neu. Die Rechtecke erscheinen nun automatisch in den angepassten Farbtönen (Bild 14). Sie können die Abstufungen der Akzentfarben verwenden, um bestimmte Bereiche in Ihrer App einzufärben. Das System bestimmt weiterhin den grundsätzlichen Basisfarbwert zur Laufzeit.
Listing 2: Experimente mit Akzentfarben
&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Window&lt;/span&gt; &lt;span class="hljs-attr"&gt;x:Class&lt;/span&gt;=&lt;span class="hljs-string"&gt;"App1.MainWindow"&lt;/span&gt; &lt;span class="hljs-attr"&gt;xmlns&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt; presentation"&lt;/span&gt; &lt;span class="hljs-attr"&gt;xmlns:x&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/winfx/2006/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt; xaml"&lt;/span&gt; &lt;span class="hljs-attr"&gt;xmlns:d&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/expression/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt; blend/2008"&lt;/span&gt; &lt;span class="hljs-attr"&gt;xmlns:local&lt;/span&gt;=&lt;span class="hljs-string"&gt;"using:App1"&lt;/span&gt; &lt;span class="hljs-attr"&gt;xmlns:mc&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.openxmlformats.org/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt; markup-compatibility/2006"&lt;/span&gt; &lt;span class="hljs-attr"&gt;mc:Ignorable&lt;/span&gt;=&lt;span class="hljs-string"&gt;"d"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;StackPanel&lt;/span&gt; &lt;span class="hljs-attr"&gt;Margin&lt;/span&gt;=&lt;span class="hljs-string"&gt;"100"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;StackPanel.Resources&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Style&lt;/span&gt; &lt;span class="hljs-attr"&gt;x:Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"RectangleStyle"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt; &lt;span class="hljs-attr"&gt;TargetType&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Rectangle"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml"&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Setter&lt;/span&gt; &lt;span class="hljs-attr"&gt;Property&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Width"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Value&lt;/span&gt;=&lt;span class="hljs-string"&gt;"200"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Setter&lt;/span&gt; &lt;span class="hljs-attr"&gt;Property&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Height"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Value&lt;/span&gt;=&lt;span class="hljs-string"&gt;"40"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Setter&lt;/span&gt; &lt;span class="hljs-attr"&gt;Property&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Margin"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Value&lt;/span&gt;=&lt;span class="hljs-string"&gt;"0,20"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Style&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;StackPanel.Resources&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Rectangle&lt;/span&gt; &lt;span class="hljs-attr"&gt;Fill&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{ThemeResource &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt; SystemAccentColorLight3}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt; &lt;span class="hljs-attr"&gt;Style&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{StaticResource RectangleStyle}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Rectangle&lt;/span&gt; &lt;span class="hljs-attr"&gt;Fill&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{ThemeResource &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt; SystemAccentColorLight2}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt; &lt;span class="hljs-attr"&gt;Style&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{StaticResource RectangleStyle}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Rectangle&lt;/span&gt; &lt;span class="hljs-attr"&gt;Fill&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{ThemeResource &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt; SystemAccentColorLight1}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt; &lt;span class="hljs-attr"&gt;Style&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{StaticResource RectangleStyle}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Rectangle&lt;/span&gt; &lt;span class="hljs-attr"&gt;Fill&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{ThemeResource &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt; SystemAccentColor}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt; &lt;span class="hljs-attr"&gt;Style&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{StaticResource RectangleStyle}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Rectangle&lt;/span&gt; &lt;span class="hljs-attr"&gt;Fill&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{ThemeResource &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt; SystemAccentColorDark1}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt; &lt;span class="hljs-attr"&gt;Style&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{StaticResource RectangleStyle}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Rectangle&lt;/span&gt; &lt;span class="hljs-attr"&gt;Fill&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{ThemeResource &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt; SystemAccentColorDark2}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt; &lt;span class="hljs-attr"&gt;Style&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{StaticResource RectangleStyle}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Rectangle&lt;/span&gt; &lt;span class="hljs-attr"&gt;Fill&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{ThemeResource &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt; SystemAccentColorDark3}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt; &lt;span class="hljs-attr"&gt;Style&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{StaticResource RectangleStyle}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;StackPanel&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Window&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; 
Listing 1: Thema (Farbdesign) der App anpassen
&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Application&lt;/span&gt; &lt;span class="hljs-attr"&gt;x:Class&lt;/span&gt;=&lt;span class="hljs-string"&gt;"App9.App"&lt;/span&gt; &lt;span class="hljs-attr"&gt;xmlns&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/winfx/2006/&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt; xaml/presentation"&lt;/span&gt; &lt;span class="hljs-attr"&gt;xmlns:x&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/winfx/2006/&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt; xaml"&lt;/span&gt; &lt;span class="hljs-attr"&gt;xmlns:local&lt;/span&gt;=&lt;span class="hljs-string"&gt;"using:App9"&lt;/span&gt; &lt;span class="hljs-attr"&gt;RequestedTheme&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Dark"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Application&lt;/span&gt;&amp;gt;&lt;/span&gt; 
Verwendung der Akzentfarben (Farbabstufungen) (Bild 14) © Autor
Kommen wir zu Symbolen, die beispielsweise unterstützend in Navigationselementen verwendet werden. Ein Großteil der Symbole ist in der Schriftart Segoe Fluent Icons enthalten. Alle Glyphen in Segoe Fluent Icons haben die gleiche feste Breite mit einer konsistenten Höhe und einem linken Ursprungspunkt. Auf diese Weise können Ebenen- und Farbeffekte erreicht werden, indem Glyphen direkt übereinander gezeichnet werden. Die Liste mit den Symbolen (Bild 15) finden Sie unter [6]. Ein rotes WLAN-Symbol erhalten Sie daher beispielsweise wie folgt:
Liste der Symbole in Segoe Fluent Icons (Bild 15) © Autor

&lt;FontIcon FontFamily="Segoe Fluent 
  Icons" Glyph="&amp;#xE701;" 
  Foreground="#C72335" /&gt; 
Auch zu den Symbolen gibt es eine ­gute Hilfe in der App WinUI 3 Gallery. Unter dem Bereich Icons können Sie nach einem solchen mit einem Stichwort suchen und erhalten dazu den Unicode-Wert und Quelltextvorlagen für XAML und C#, um das Icon in die eigene App zu übernehmen (Bild 16).
Auswahlhilfe zu den Symbolen in der App WinUI 3 Gallery (Bild 16) © Autor
Sie sehen es, mithilfe der WinUI 3 lassen sich die modernen Design­ansätze leicht realisieren. Nicht alle ­Ideen konnten wir im Konzept und der Praxis vorstellen. Dennoch sollte das Vor­gehen hoffentlich deutlich geworden sein. Am besten geht man in der Form vor, dass man sich mit einem bestimmten Designaspekt, beispielsweise Farben, Symbole, Schriftarten et cetera, in der Theorie vertraut macht und dann in der Dokumentation schaut, wie dies technisch realisiert wird. Nach und nach dürfte dann das Design der App auf eine vollständig neue Basis gestellt werden. Ebenso werden Sie feststellen, dass es für ein gelungenes App-Design Zeit, Erfahrungen und Inspiration braucht. Entwickler, die auf die Expertise eines Designers zurückgreifen können, dürfen sich an dieser Stelle glücklich schätzen.

Fazit und Ausblick

Der Artikel hat die essenzielle Rolle des Designs bei der Entwicklung von Apps verdeutlicht und gezeigt, welche maßgeblichen Auswirkungen ein gelungenes Design auf den Erfolg und die Benutzerfreundlichkeit einer App haben kann. Dabei geht es stets um mehr als um Fragen der Gestaltung, denn Design und Benutzbarkeit von Software greifen ineinander. Ein ansprechendes und nutzerfreundliches Design hat das Potenzial, eine tiefere emotionale Bindung zu schaffen und eine positive Nutzererfahrung zu fördern. Schafft ein Design es, die Anforderungen und Erwartungen der Zielgruppe zu erfüllen und gleichzeitig Ästhetik und Benutzerfreundlichkeit in Einklang zu bringen, wird die App als intuitiv, effizient und angenehm wahrgenommen. Dadurch steigt die Wahrscheinlichkeit, dass Nutzer die App weiterempfehlen und gerne wiederkehren.Darüber hinaus darf die Barrierefreiheit im App-Design nicht vernachlässigt werden. Eine inklusive Gestaltung, welche die Bedürfnisse von Menschen mit unterschiedlichen Fähigkeiten berücksichtigt, erhöht die Reichweite und erleichtert es allen Nutzern, von den Funktionen der App zu profitieren. In ­einer zunehmend digitalen Welt ist dieses kein „Nice to have“, sondern ein „Muss“.Für Windows-Entwickler sind die Ideen des FluentDesigns richtungsweisend. Durch die Integra­tion von Fluent Design in den De­signprozess kann man die Apps mit einer einheitlichen Benutzeroberfläche ausstatten, die sich nahtlos in die Windows-Plattform und andere Micro­soft-Produkte einfügt. Fluent Design ist mehr als nur eine Ästhetik. Es basiert auf zentralen Säulen wie Licht, Tiefe und Material.Diese Artikelserie hat bisher versucht, Ihnen einige Aspekte (Konzept, Layout, Controls, Design) der Gestaltung am Beispiel der WinUI 3 näherzubringen. In der kommenden Ausgabe werfen wir das alles zur Kombination „in einen Topf“ und zeigen die ganzheitliche Anwendung an einem Beispiel.

Fussnoten

  1. Fluent 2, http://www.dotnetpro.de/SL2312WinUI3_1
  2. Microsoft Learn, Layering and elevation in Windows 11, http://www.dotnetpro.de/SL2312WinUI3_2
  3. Fluent System Icons bei GitHub, http://www.dotnetpro.de/SL2312WinUI3_3
  4. Microsoft Fluent system iconography, http://www.dotnetpro.de/SL2312WinUI3_4
  5. Techniques for WCAG 2.0: Resources, http://www.dotnetpro.de/SL2312WinUI3_5
  6. Microsoft Learn, Schriftart „Segoe Fluent Icons“, http://www.dotnetpro.de/SL2312WinUI3_6

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Evolutionäres Prototyping von Business-Apps - Low Code/No Code und KI mit Power Apps
Microsoft baut Power Apps zunehmend mit Features aus, um die Low-Code-/No-Code-Welt mit der KI und der professionellen Programmierung zu verbinden.
19 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige