#383 Farbschema "System" kehrte sein Versprechen um. ThemeManager.IsDark verglich ActualThemeVariant der Anwendung mit Dark; bei "System" steht dort Default, waehrend die Fenster selbst nach hell oder dunkel aufloesen. IsDark war damit im Auslieferungszustand immer false - Symbol, Beschriftung und Toggle() haengen alle an diesem Wert. Gelesen wird jetzt die angeforderte Variante, bei "System" die Betriebssystem-Einstellung. Derselbe Fehler steckte in Brush(): die Methode suchte bei "System" in den hellen Farben, waehrend dunkel gezeichnet wurde - betroffen war genau das, wofuer es sie gibt (Zeilenfarben, KPI-Vorzeichen). Neu ist ausserdem, dass eine Umstellung am Betriebssystem ThemeChanged ausloest, solange "System" gilt. #384 Sternspalten quetschten die Endspalten weg. Der Merksatz aus #56 galt bisher nur fuer gridTraders. Angewandt auf gridOpen und gridClosed sowie auf die uebrigen Grids, deren Spaltensumme den sichtbaren Bereich uebersteigt (gridTrades, gridJobs, gridLedger, gridCandidates, gridPositions, gridHistory). Auto statt Stern, dazu MaxWidth 360 - anders als "Name" in #56 traegt "Markt" ganze Fragesaetze und wuerde die Zahlenspalten sonst aus dem Blick schieben. Grids mit weniger Spalten als Platz behalten ihre Sternspalte. #385 Gewinntage wurden rot gezeichnet. Eine ColumnSeries hat genau ein Fill fuer alle ihre Balken; gefaerbt wurde deshalb nach der Summe ueber alle Tage. Jetzt zwei Reihen an denselben Positionen - Gewinne in der einen, Verluste in der anderen, Luecken als null. "PnL je Modul" faerbt ebenfalls nach Vorzeichen: zwei Diagramme nebeneinander mit verschiedenen Leseweisen waeren schlechter als beide ohne. #386 Drei Kleinigkeiten. Die Equity-Achse beschriftete zehn Teilstriche mit zwei Daten - unter drei Tagen kommt jetzt die Uhrzeit dazu, darueber gilt hoechstens ein Teilstrich je Tag. "Deaktivierte Module" sah aus, als fehle das Bedienelement: leere Nur-Lese-Felder zeigen jetzt "—" in einer abgesetzten Flaeche. Die Abschnittsbeschriftungen der Seitenleiste lagen bei 3,65:1 statt der geforderten 4,5:1 (im Bild sogar 1,83:1, weil 10 px mit Sperrung ausduennen) - AppCaptionTextBrush erreicht 4,61:1 hell und 6,21:1 dunkel und bleibt deutlich leiser als die Eintraege darunter. Build gruen, 486 Tests gruen. Die Sichtpruefung auf der Linux-VM steht noch aus; die drei rein visuellen Punkte sind aus dem Quelltext begruendet, nicht im Bild belegt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
443 lines
27 KiB
XML
443 lines
27 KiB
XML
<Application xmlns="https://github.com/avaloniaui"
|
||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||
x:Class="PolyTrader.App.Avalonia.App">
|
||
|
||
<!--
|
||
Farbschema und Designsprache. RequestedThemeVariant wird NICHT hier festgelegt, sondern beim
|
||
Start vom ThemeManager aus den Server-Settings gesetzt (hell / dunkel / dem System folgen).
|
||
|
||
Alle projekteigenen Farben stehen als Token in beiden Varianten. Im XAML werden sie über
|
||
DynamicResource gebunden – dadurch wechseln sie beim Umschalten von selbst. Nur wenige
|
||
Stellen setzen Farben im Code (Grid-Zeilen, Umschalter); die holen sie über
|
||
ThemeManager.Brush(...) und zeichnen sich bei ThemeChanged neu.
|
||
|
||
Die Werte stammen aus dem Claude-Design-Mockup „PolyTrader UI Redesign" (Design-System
|
||
„Industry"): gedämpftes Blaugrau als Akzent, papierne Grundfläche, Haarlinien statt Kästen,
|
||
eckige Ecken. Farbmischungen des Mockups (color-mix) sind hier ausgerechnet, weil XAML
|
||
keine Mischfunktion kennt.
|
||
|
||
Bewusste Abweichung: Das Mockup färbt Gewinne im Akzentblau. PolyTrader bleibt bei Grün/Rot
|
||
für Gewinn/Verlust – die Bedeutungsfarbe ist im Handelskontext eingeführt und trägt weiter
|
||
als eine reine Stilentscheidung. Die Töne sind aber an die neue Palette angeglichen
|
||
(entsättigt statt Signalfarbe).
|
||
-->
|
||
<Application.Resources>
|
||
<ResourceDictionary>
|
||
|
||
<!-- Schriften des Mockups. Avalonia probiert die Liste der Reihe nach durch: sind
|
||
Barlow / Barlow Condensed lokal installiert, werden sie genommen, sonst fällt es
|
||
auf die mitgelieferte Inter zurück. Damit läuft die App auch dort sauber, wo die
|
||
Schriften fehlen (Linux-Zielsystem, Build-Server). -->
|
||
<FontFamily x:Key="AppFontBody">Barlow, Inter, Segoe UI, sans-serif</FontFamily>
|
||
<FontFamily x:Key="AppFontHeading">Barlow Condensed, Barlow, Inter, Segoe UI, sans-serif</FontFamily>
|
||
<FontFamily x:Key="AppFontMono">Consolas, Menlo, DejaVu Sans Mono, monospace</FontFamily>
|
||
|
||
<ResourceDictionary.ThemeDictionaries>
|
||
|
||
<ResourceDictionary x:Key="Light">
|
||
<!-- Grundflächen und Rahmen -->
|
||
<SolidColorBrush x:Key="AppBgBrush" Color="#F2F2F3" />
|
||
<SolidColorBrush x:Key="AppSurfaceBrush" Color="#E9E9EA" />
|
||
<SolidColorBrush x:Key="AppSurfaceAltBrush" Color="#EDEDEE" />
|
||
<SolidColorBrush x:Key="AppCardBrush" Color="#E9E9EA" />
|
||
<SolidColorBrush x:Key="AppBorderBrush" Color="#D0D0D1" />
|
||
<SolidColorBrush x:Key="AppDividerBrush" Color="#D0D0D1" />
|
||
<!-- Texte -->
|
||
<SolidColorBrush x:Key="AppTextBrush" Color="#1D1F20" />
|
||
<SolidColorBrush x:Key="AppMutedTextBrush" Color="#76787A" />
|
||
<SolidColorBrush x:Key="AppCaptionTextBrush" Color="#66686A" />
|
||
<SolidColorBrush x:Key="AppReadOnlyTextBrush" Color="#444647" />
|
||
<!-- Akzent -->
|
||
<SolidColorBrush x:Key="AppAccentBrush" Color="#5980A6" />
|
||
<SolidColorBrush x:Key="AppAccentAltBrush" Color="#728FAB" />
|
||
<SolidColorBrush x:Key="AppAccentStrongBrush" Color="#416180" />
|
||
<!-- Akzent 16 % auf der Grundfläche: Auswahl- und Aktiv-Hinterlegung -->
|
||
<SolidColorBrush x:Key="AppAccentSoftBrush" Color="#DAE0E7" />
|
||
<!-- Bedeutungsfarben -->
|
||
<SolidColorBrush x:Key="AppPositiveBrush" Color="#2F6B46" />
|
||
<SolidColorBrush x:Key="AppNegativeBrush" Color="#8E3229" />
|
||
<SolidColorBrush x:Key="AppWarningBrush" Color="#8A6420" />
|
||
<!-- Benachrichtigungsleiste (Kante links + Symbol) -->
|
||
<SolidColorBrush x:Key="AppNotifyWarnBrush" Color="#B5822A" />
|
||
<SolidColorBrush x:Key="AppNotifyErrorBrush" Color="#C0392B" />
|
||
<!-- Zeilenfärbung der Trade-Listen (gedämpft auf hellem Grund) -->
|
||
<SolidColorBrush x:Key="AppTradeLossBrush" Color="#EFD4D0" />
|
||
<SolidColorBrush x:Key="AppTradeSmallWinBrush" Color="#D8E7DC" />
|
||
<SolidColorBrush x:Key="AppTradeBigWinBrush" Color="#A8CDB4" />
|
||
<!-- Trading-Umschalter im Launcher -->
|
||
<SolidColorBrush x:Key="AppToggleActiveBrush" Color="#A8CFAF" />
|
||
<SolidColorBrush x:Key="AppToggleSellOnlyBrush" Color="#E0B26A" />
|
||
<SolidColorBrush x:Key="AppToggleInactiveBrush" Color="#D89A92" />
|
||
<!-- Supervisor-Analyseverlauf -->
|
||
<SolidColorBrush x:Key="AppChatUserBrush" Color="#5980A6" />
|
||
<SolidColorBrush x:Key="AppChatAgentBrush" Color="#4E8168" />
|
||
</ResourceDictionary>
|
||
|
||
<ResourceDictionary x:Key="Dark">
|
||
<!-- Grundflächen und Rahmen -->
|
||
<SolidColorBrush x:Key="AppBgBrush" Color="#1A1C1E" />
|
||
<SolidColorBrush x:Key="AppSurfaceBrush" Color="#232527" />
|
||
<SolidColorBrush x:Key="AppSurfaceAltBrush" Color="#1F2123" />
|
||
<SolidColorBrush x:Key="AppCardBrush" Color="#232527" />
|
||
<SolidColorBrush x:Key="AppBorderBrush" Color="#3C3E40" />
|
||
<SolidColorBrush x:Key="AppDividerBrush" Color="#3C3E40" />
|
||
<!-- Texte: heller, aber nicht reinweiß – sonst flimmert es auf Dunkel -->
|
||
<SolidColorBrush x:Key="AppTextBrush" Color="#EEF0F1" />
|
||
<SolidColorBrush x:Key="AppMutedTextBrush" Color="#8D9092" />
|
||
<SolidColorBrush x:Key="AppCaptionTextBrush" Color="#A2A5A7" />
|
||
<SolidColorBrush x:Key="AppReadOnlyTextBrush" Color="#C9CCCE" />
|
||
<!-- Akzent: auf Dunkel aufgehellt, damit der Kontrast trägt -->
|
||
<SolidColorBrush x:Key="AppAccentBrush" Color="#7EA3C6" />
|
||
<SolidColorBrush x:Key="AppAccentAltBrush" Color="#8FA8C2" />
|
||
<SolidColorBrush x:Key="AppAccentStrongBrush" Color="#B5D9FD" />
|
||
<SolidColorBrush x:Key="AppAccentSoftBrush" Color="#2A3239" />
|
||
<!-- Bedeutungsfarben: gleiche Aussage, aufgehellt für Kontrast auf Dunkel -->
|
||
<SolidColorBrush x:Key="AppPositiveBrush" Color="#6FAE86" />
|
||
<SolidColorBrush x:Key="AppNegativeBrush" Color="#D9756A" />
|
||
<SolidColorBrush x:Key="AppWarningBrush" Color="#D3A45E" />
|
||
<SolidColorBrush x:Key="AppNotifyWarnBrush" Color="#D3A45E" />
|
||
<SolidColorBrush x:Key="AppNotifyErrorBrush" Color="#D9756A" />
|
||
<!-- Zeilenfärbung: gedämpft statt pastell – die hellen Töne würden auf Dunkel
|
||
blenden und den Text unlesbar machen. Reihenfolge der Aussage bleibt. -->
|
||
<SolidColorBrush x:Key="AppTradeLossBrush" Color="#4A2B27" />
|
||
<SolidColorBrush x:Key="AppTradeSmallWinBrush" Color="#2A3A30" />
|
||
<SolidColorBrush x:Key="AppTradeBigWinBrush" Color="#3A5C46" />
|
||
<!-- Trading-Umschalter -->
|
||
<SolidColorBrush x:Key="AppToggleActiveBrush" Color="#3F7A55" />
|
||
<SolidColorBrush x:Key="AppToggleSellOnlyBrush" Color="#9A6C25" />
|
||
<SolidColorBrush x:Key="AppToggleInactiveBrush" Color="#8E3B3B" />
|
||
<!-- Supervisor-Analyseverlauf -->
|
||
<SolidColorBrush x:Key="AppChatUserBrush" Color="#7EA3C6" />
|
||
<SolidColorBrush x:Key="AppChatAgentBrush" Color="#78B49A" />
|
||
</ResourceDictionary>
|
||
|
||
</ResourceDictionary.ThemeDictionaries>
|
||
</ResourceDictionary>
|
||
</Application.Resources>
|
||
|
||
<Application.Styles>
|
||
<FluentTheme />
|
||
|
||
<!-- PFLICHT fuer Avalonia.Controls.DataGrid: Das Steuerelement liegt in einem eigenen
|
||
Paket und bringt sein Theme NICHT ueber FluentTheme mit. Ohne diese Zeile rendert
|
||
kein einziges DataGrid - weder Zeilen noch Spaltenkoepfe, die Flaeche bleibt leer.
|
||
Es gibt dabei weder eine Fehlermeldung noch eine Bindungswarnung, und die
|
||
Konstruktionspruefung (Schalter smoke-ui) bleibt gruen, weil das Fenster aufgebaut wird.
|
||
Aufgefallen erst beim Linux-Sichttest am 26.08.2026 (Befund B-10). -->
|
||
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml" />
|
||
|
||
<!-- ═══ Grundgestaltung ═══════════════════════════════════════════════════════
|
||
Projektweit zentral statt je Fenster wiederholt, damit alle Ansichten gleich
|
||
aussehen. Die Designsprache des Mockups lebt fast vollständig hier. -->
|
||
|
||
<Style Selector="Window">
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontBody}" />
|
||
<Setter Property="FontSize" Value="13" />
|
||
<Setter Property="Background" Value="{DynamicResource AppBgBrush}" />
|
||
<Setter Property="Foreground" Value="{DynamicResource AppTextBrush}" />
|
||
</Style>
|
||
|
||
<!-- Überschriften laufen in der schmalen Schnittvariante (Barlow Condensed). -->
|
||
<Style Selector="TextBlock.h4">
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
|
||
<Setter Property="FontSize" Value="19" />
|
||
<Setter Property="FontWeight" Value="SemiBold" />
|
||
</Style>
|
||
<Style Selector="TextBlock.h5">
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
|
||
<Setter Property="FontSize" Value="15" />
|
||
<Setter Property="FontWeight" Value="SemiBold" />
|
||
</Style>
|
||
|
||
<!-- „Kicker": die kleine Versalzeile in Akzentfarbe über einer Überschrift.
|
||
Avalonia kennt kein text-transform – die Texte stehen im XAML in Versalien. -->
|
||
<Style Selector="TextBlock.kicker">
|
||
<Setter Property="FontSize" Value="10" />
|
||
<Setter Property="LetterSpacing" Value="1.2" />
|
||
<Setter Property="Foreground" Value="{DynamicResource AppAccentBrush}" />
|
||
</Style>
|
||
|
||
<!-- Gedämpfte Hinweistexte (Statuszeilen, Erklärungen unter Feldern). -->
|
||
<Style Selector="TextBlock.muted">
|
||
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
|
||
</Style>
|
||
|
||
<!-- Gewinn/Verlust als Klasse statt als im Code aufgelöster Pinsel. Über DynamicResource
|
||
folgt die Farbe dem Themenwechsel von selbst; ein im Code geholter Pinsel blieb dagegen
|
||
auf der Farbe stehen, die beim Erzeugen der Zeile galt (Befund B-6). -->
|
||
<Style Selector="TextBlock.positive, SelectableTextBlock.positive">
|
||
<Setter Property="Foreground" Value="{DynamicResource AppPositiveBrush}" />
|
||
</Style>
|
||
<Style Selector="TextBlock.negative, SelectableTextBlock.negative">
|
||
<Setter Property="Foreground" Value="{DynamicResource AppNegativeBrush}" />
|
||
</Style>
|
||
|
||
<Style Selector="TextBlock.mono, SelectableTextBlock.mono">
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontMono}" />
|
||
</Style>
|
||
|
||
<!-- ═══ Steuerelemente: eckig und hairline ════════════════════════════════════
|
||
Das Mockup setzt border-radius durchgängig auf 0 und zeichnet Kästen nur mit
|
||
einer 1px-Linie. Fluent bringt gerundete, gefüllte Flächen mit – deshalb hier
|
||
flächendeckend zurückgesetzt. -->
|
||
|
||
<!-- Zum Kalenderknopf des CalendarDatePicker (Befund B-9 des Linux-Sichttests, wo statt
|
||
eines Kalendersymbols eine "26" stand): Das ist NICHT unsere Formatvorlage. Am
|
||
28.08.2026 auf der Linux-VM nachgemessen - die Zahl ist das heutige Datum (am 26.08.
|
||
eine "26", am 28.08. eine "28"), und sie bleibt unveraendert, wenn man diese
|
||
Vorlage per ":not(#PART_Button)" vom Knopf fernhaelt oder das Farbschema wechselt.
|
||
Avalonia zeichnet dort die heutige Tageszahl in ein Kalenderblatt; unter Linux fehlt
|
||
der Blatt-Glyph, uebrig bleibt ein Punkt. Rein kosmetisch, siehe Bugtracker-Item #50. -->
|
||
<Style Selector="Button">
|
||
<Setter Property="CornerRadius" Value="0" />
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
|
||
<Setter Property="FontSize" Value="13" />
|
||
<Setter Property="Padding" Value="10,5" />
|
||
<Setter Property="Background" Value="Transparent" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
|
||
<Setter Property="BorderThickness" Value="1" />
|
||
</Style>
|
||
|
||
<!-- Fluent malt Füllung und Rahmen im Vorlagenteil und überschreibt sie je Zustand.
|
||
Deshalb müssen Schwebe- und Druckzustand dort gesetzt werden, sonst blitzt beim
|
||
Überfahren wieder das Fluent-Grau durch. -->
|
||
<Style Selector="Button /template/ ContentPresenter#PART_ContentPresenter">
|
||
<Setter Property="CornerRadius" Value="0" />
|
||
</Style>
|
||
<Style Selector="Button:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
||
<Setter Property="Background" Value="{DynamicResource AppSurfaceBrush}" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentBrush}" />
|
||
</Style>
|
||
<Style Selector="Button:pressed /template/ ContentPresenter#PART_ContentPresenter">
|
||
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentBrush}" />
|
||
</Style>
|
||
|
||
<!-- Hauptaktion: gefüllt im Akzent. -->
|
||
<Style Selector="Button.primary">
|
||
<Setter Property="Foreground" Value="{DynamicResource AppBgBrush}" />
|
||
</Style>
|
||
<Style Selector="Button.primary /template/ ContentPresenter#PART_ContentPresenter">
|
||
<Setter Property="Background" Value="{DynamicResource AppAccentBrush}" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentBrush}" />
|
||
</Style>
|
||
<Style Selector="Button.primary:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
||
<Setter Property="Background" Value="{DynamicResource AppAccentStrongBrush}" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentStrongBrush}" />
|
||
</Style>
|
||
|
||
<!-- Rahmenlose Schaltfläche (Seitenleiste, Symbolknöpfe). -->
|
||
<Style Selector="Button.ghost">
|
||
<Setter Property="BorderThickness" Value="0" />
|
||
<Setter Property="Background" Value="Transparent" />
|
||
</Style>
|
||
<Style Selector="Button.ghost:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
||
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
|
||
<Setter Property="BorderBrush" Value="Transparent" />
|
||
</Style>
|
||
|
||
<Style Selector="TextBox, ComboBox, NumericUpDown, CalendarDatePicker, AutoCompleteBox">
|
||
<Setter Property="CornerRadius" Value="0" />
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontBody}" />
|
||
<Setter Property="MinHeight" Value="30" />
|
||
</Style>
|
||
|
||
<Style Selector="CheckBox, RadioButton">
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontBody}" />
|
||
</Style>
|
||
|
||
<Style Selector="TabItem">
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
|
||
<Setter Property="FontSize" Value="15" />
|
||
<Setter Property="MinHeight" Value="38" />
|
||
</Style>
|
||
|
||
<!-- ═══ Tabellen ══════════════════════════════════════════════════════════════
|
||
Kopfzeile klein, gesperrt und gedämpft; Zeilen nur durch eine Haarlinie
|
||
getrennt (keine Gitterkästen).
|
||
|
||
SPALTENBREITEN – Regel für alle Grids: feste Pixelbreiten nur, wo sie wirklich
|
||
gebraucht werden. Der Normalfall ist Width="Auto" (misst Überschrift UND Werte)
|
||
plus genau eine Width="*"-Spalte mit MinWidth für den Fließtext. Die aus WinForms
|
||
übernommenen festen Breiten waren auf die Datenwerte ausgelegt, nicht auf die
|
||
Überschriften – in der breiteren Avalonia-Standardschrift standen dann „Trades (7",
|
||
„Winrate '" und „Fee (bp" in den Köpfen, während die Werte darunter mühelos passten
|
||
(Befunde B-11 und B-13 des Linux-Sichttests). -->
|
||
<Style Selector="DataGrid">
|
||
<Setter Property="GridLinesVisibility" Value="Horizontal" />
|
||
<Setter Property="HeadersVisibility" Value="Column" />
|
||
<Setter Property="IsReadOnly" Value="True" />
|
||
<Setter Property="CanUserResizeColumns" Value="True" />
|
||
<Setter Property="CanUserSortColumns" Value="True" />
|
||
<Setter Property="RowHeight" Value="26" />
|
||
<Setter Property="FontSize" Value="12.5" />
|
||
<Setter Property="Background" Value="Transparent" />
|
||
<Setter Property="BorderThickness" Value="0" />
|
||
<Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource AppDividerBrush}" />
|
||
</Style>
|
||
<Style Selector="DataGridColumnHeader">
|
||
<!-- Kein LetterSpacing: DataGridColumnHeader ist ein ContentControl und kennt die
|
||
Eigenschaft nicht (nur TextBlock hat sie). Die Sperrung der Mockup-Kopfzeile
|
||
entfällt hier deshalb bewusst. -->
|
||
<Setter Property="FontSize" Value="10.5" />
|
||
<Setter Property="FontWeight" Value="Normal" />
|
||
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
|
||
<Setter Property="Background" Value="Transparent" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
|
||
<Setter Property="BorderThickness" Value="0,0,0,1" />
|
||
<Setter Property="Padding" Value="7,5" />
|
||
</Style>
|
||
|
||
<!-- Jede Textzelle zeigt ihren vollen Inhalt im Tooltip. Auch mit sauberen Breiten
|
||
bleiben lange Marktfragen und Meldungen zwangsläufig abgeschnitten; so kommt man
|
||
ohne Spaltenziehen an den ganzen Text. -->
|
||
<Style Selector="DataGridCell TextBlock">
|
||
<Setter Property="ToolTip.Tip" Value="{Binding $self.Text}" />
|
||
</Style>
|
||
|
||
<!-- ═══ Bausteine ═════════════════════════════════════════════════════════════ -->
|
||
|
||
<!-- KPI-Kachel: entspricht den zweizeiligen Labels der WinForms-Oberfläche
|
||
("<Titel> \n <Wert>"), siehe docs/UI-SPEZIFIKATION-WinForms.md. -->
|
||
<Style Selector="Border.kpi">
|
||
<Setter Property="Background" Value="Transparent" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
|
||
<Setter Property="BorderThickness" Value="1" />
|
||
<Setter Property="CornerRadius" Value="0" />
|
||
<Setter Property="Padding" Value="12,10" />
|
||
<Setter Property="Margin" Value="0,0,10,10" />
|
||
<Setter Property="MinWidth" Value="160" />
|
||
</Style>
|
||
<Style Selector="Border.kpi > StackPanel > TextBlock.caption">
|
||
<Setter Property="FontSize" Value="10" />
|
||
<Setter Property="LetterSpacing" Value="1.2" />
|
||
<Setter Property="Foreground" Value="{DynamicResource AppAccentBrush}" />
|
||
</Style>
|
||
<Style Selector="Border.kpi > StackPanel > TextBlock.value">
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
|
||
<Setter Property="FontSize" Value="18" />
|
||
<Setter Property="FontWeight" Value="SemiBold" />
|
||
</Style>
|
||
|
||
<!-- Allgemeiner Rahmen-Kasten (Detailbereiche, Log-Fläche). -->
|
||
<Style Selector="Border.card">
|
||
<Setter Property="Background" Value="Transparent" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
|
||
<Setter Property="BorderThickness" Value="1" />
|
||
<Setter Property="CornerRadius" Value="0" />
|
||
<Setter Property="Padding" Value="12" />
|
||
</Style>
|
||
|
||
<!-- Statuskennzeichen in Listen und Kopfzeilen. -->
|
||
<Style Selector="Border.tag">
|
||
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
|
||
<Setter Property="CornerRadius" Value="0" />
|
||
<Setter Property="Padding" Value="8,2" />
|
||
</Style>
|
||
|
||
<!-- Werkzeugleiste oben in jeder Ansicht (Ersatz für ToolStrip). Im neuen Design
|
||
ohne Füllfläche – nur die Schaltflächen stehen auf dem Grund. -->
|
||
<Style Selector="Border.toolbar">
|
||
<Setter Property="Background" Value="Transparent" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
|
||
<Setter Property="BorderThickness" Value="0,0,0,1" />
|
||
<Setter Property="Padding" Value="0,0,0,10" />
|
||
</Style>
|
||
<Style Selector="Border.toolbar Button">
|
||
<Setter Property="Margin" Value="0,0,6,0" />
|
||
<Setter Property="Padding" Value="10,5" />
|
||
<Setter Property="FontSize" Value="12.5" />
|
||
</Style>
|
||
|
||
<!-- Statusleiste unten (Ersatz für StatusStrip). -->
|
||
<Style Selector="Border.statusbar">
|
||
<Setter Property="Background" Value="Transparent" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
|
||
<Setter Property="BorderThickness" Value="0,1,0,0" />
|
||
<Setter Property="Padding" Value="20,5" />
|
||
</Style>
|
||
<Style Selector="Border.statusbar TextBlock">
|
||
<Setter Property="FontSize" Value="11.5" />
|
||
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
|
||
<Setter Property="VerticalAlignment" Value="Center" />
|
||
</Style>
|
||
|
||
<!-- Senkrechter Trenner in Werkzeugleisten. -->
|
||
<Style Selector="Border.sep">
|
||
<Setter Property="Width" Value="1" />
|
||
<Setter Property="Height" Value="18" />
|
||
<Setter Property="Margin" Value="4,0,10,0" />
|
||
<Setter Property="Background" Value="{DynamicResource AppDividerBrush}" />
|
||
</Style>
|
||
|
||
<!-- Gruppenkasten (Launcher-Widgets). Überschrift wie ein Kicker gesetzt. -->
|
||
<Style Selector="HeaderedContentControl">
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
|
||
<Setter Property="FontSize" Value="15" />
|
||
</Style>
|
||
|
||
<Style Selector="GridSplitter">
|
||
<Setter Property="Background" Value="{DynamicResource AppDividerBrush}" />
|
||
</Style>
|
||
|
||
<!-- ═══ Seitenleiste der Shell ════════════════════════════════════════════════ -->
|
||
|
||
<Style Selector="Button.nav">
|
||
<Setter Property="BorderThickness" Value="0" />
|
||
<Setter Property="Background" Value="Transparent" />
|
||
<Setter Property="HorizontalAlignment" Value="Stretch" />
|
||
<Setter Property="HorizontalContentAlignment" Value="Left" />
|
||
<Setter Property="Padding" Value="9,7" />
|
||
<Setter Property="FontFamily" Value="{DynamicResource AppFontBody}" />
|
||
<Setter Property="FontSize" Value="13" />
|
||
</Style>
|
||
<!-- Eingeklappt steht nur das Symbol da – dann mittig statt links. -->
|
||
<Style Selector="Button.nav.icononly">
|
||
<Setter Property="HorizontalContentAlignment" Value="Center" />
|
||
</Style>
|
||
<Style Selector="Button.nav.active">
|
||
<Setter Property="Foreground" Value="{DynamicResource AppAccentBrush}" />
|
||
<Setter Property="FontWeight" Value="SemiBold" />
|
||
</Style>
|
||
<Style Selector="Button.nav.active /template/ ContentPresenter#PART_ContentPresenter">
|
||
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
|
||
<Setter Property="BorderBrush" Value="Transparent" />
|
||
</Style>
|
||
<Style Selector="Button.nav:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
||
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
|
||
<Setter Property="BorderBrush" Value="Transparent" />
|
||
</Style>
|
||
|
||
<!-- Abschnittsüberschrift in der Seitenleiste. -->
|
||
<!--
|
||
Abschnittsbeschriftungen der Seitenleiste („UEBERSICHT", „MODULE", „SYSTEM").
|
||
Sie sollen ordnen, nicht gelesen werden – zurueckhaltend ist Absicht. Mit
|
||
AppMutedTextBrush ging das zu weit: 3,65:1 auf der Seitenleistenflaeche, und weil
|
||
10px mit Sperrung beim Zeichnen ausduennen, kamen im Bild nur 1,83:1 an (Befund #386).
|
||
WCAG verlangt 4,5:1 fuer kleinen Text. AppCaptionTextBrush liegt bei 4,61:1 (hell) und
|
||
6,21:1 (dunkel) und bleibt damit deutlich leiser als die Eintraege darunter (8,8:1);
|
||
das Medium-Gewicht haelt die gezeichneten Pixel naeher an der gesetzten Farbe.
|
||
-->
|
||
<Style Selector="TextBlock.navgroup">
|
||
<Setter Property="FontSize" Value="10" />
|
||
<Setter Property="LetterSpacing" Value="1.4" />
|
||
<Setter Property="Margin" Value="9,0,0,6" />
|
||
<Setter Property="FontWeight" Value="Medium" />
|
||
<Setter Property="Foreground" Value="{DynamicResource AppCaptionTextBrush}" />
|
||
</Style>
|
||
|
||
<!-- ═══ Benachrichtigungsleiste ═══════════════════════════════════════════════
|
||
Farbige Kante links, sonst nur eine gedämpfte Bandfläche – wie im Mockup. -->
|
||
<Style Selector="Border.notify">
|
||
<Setter Property="Background" Value="{DynamicResource AppSurfaceBrush}" />
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppNotifyWarnBrush}" />
|
||
<Setter Property="BorderThickness" Value="3,0,0,0" />
|
||
<Setter Property="Padding" Value="17,6" />
|
||
</Style>
|
||
<Style Selector="Border.notify.error">
|
||
<Setter Property="BorderBrush" Value="{DynamicResource AppNotifyErrorBrush}" />
|
||
</Style>
|
||
</Application.Styles>
|
||
|
||
</Application>
|