Farbschema hell / dunkel / dem System folgen, umschaltbar per Klick, Stand wird in server_settings.xml gemerkt (ServerSettings.Theme). Der Editor zeigt die Einstellung automatisch als Auswahlfeld - kein Zusatzcode, weil sie ein Enum ist. - App.axaml: 18 Farb-Token je Variante (Flaechen, Rahmen, Texte, Bedeutungsfarben, Zeilenfaerbung, Trading-Umschalter, Chat-Rollen). Die Standard-Steuerelemente stellt das FluentTheme selbst um. - 22 fest verdrahtete Farben in 11 XAML-Dateien auf DynamicResource umgestellt - die wechseln damit von selbst mit. - Umschalter (Sonne/Mond) sitzt in der gemeinsamen Fensterleiste, also auf JEDEM Fenster. Der eigentliche Knackpunkt waren die Farben, die im Code gesetzt werden - die folgen dem Thema NICHT von selbst: - TradeRowPalette liefert jetzt Eigenschaften statt static readonly, loest also bei jedem Zugriff neu auf. Im Dunkeln gedaempfte Toene statt der hellen Pastelltoene, die dort blenden und den Text unlesbar machen wuerden. - ChatEntry speichert die ROLLE statt eines fertigen Brush - dadurch stimmt der Verlauf nach dem Umschalten ohne Neuaufbau der Liste. - Launcher-Umschalter, Dashboard-KPI und die Grid-Zeilenfarben zeichnen sich ueber ThemeManager.ThemeChanged neu. - Das Terminal bleibt in beiden Schemata dunkel (Konsolen sind konventionell dunkel). Nebenbei die Anzeige-Kultur gepinnt (stand ohnehin auf der Linux-Liste): auf Linux richtet sie sich sonst nach LANG/LC_ALL, das unter systemd oft nicht gesetzt ist - dann faellt .NET auf Invariant zurueck und aus '1.234,56 USDC' wird '1,234.56 USDC'. Maschinen-I/O laeuft davon unabhaengig weiter invariant. Smoke-UI prueft jetzt zusaetzlich, dass ALLE 18 Farben in BEIDEN Varianten aufloesen - ein vertippter Ressourcenschluessel wuerde sonst still grau werden. Verifiziert: Solution baut, 450 Tests gruen, --smoke-ui gruen (10 Fenster + Editor + beide Farbschemata), App startet im gespeicherten Schema, Linux-Publish laeuft. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
125 lines
7.3 KiB
XML
125 lines
7.3 KiB
XML
<UserControl xmlns="https://github.com/avaloniaui"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
|
|
x:Class="PolyTrader.App.Avalonia.Controls.SettingsEditor">
|
|
|
|
<!--
|
|
Ersatz für das WinForms-PropertyGrid. Aufbau nach Vorgabe:
|
|
Kategorie-Überschrift (fett), darunter je Feld eine Zeile aus Beschriftung links und
|
|
Steuerelement rechts; ein etwaiger Erklärungstext steht klein unter dem Feld.
|
|
|
|
Vollständig deklarativ: WELCHE Felder es gibt, liefert das Datenmodell
|
|
(SettingsModelBuilder liest Category/DisplayName/Description/Browsable vom Einstellungs-
|
|
objekt). WIE ein Feld aussieht, steht hier — je Feldtyp ein DataTemplate. Damit bleibt die
|
|
Layout-Regel gewahrt und alle Einstellungsfenster sehen automatisch gleich aus.
|
|
-->
|
|
<UserControl.Resources>
|
|
<!-- Einheitliche Beschriftungsspalte: sorgt für die saubere Flucht aller Felder. -->
|
|
<x:Double x:Key="LabelWidth">210</x:Double>
|
|
</UserControl.Resources>
|
|
|
|
<UserControl.Styles>
|
|
<Style Selector="TextBlock.sectionTitle">
|
|
<Setter Property="FontWeight" Value="Bold" />
|
|
<Setter Property="Margin" Value="0,16,0,8" />
|
|
</Style>
|
|
<Style Selector="TextBlock.fieldLabel">
|
|
<Setter Property="VerticalAlignment" Value="Center" />
|
|
<Setter Property="Margin" Value="0,0,12,0" />
|
|
</Style>
|
|
<Style Selector="TextBlock.fieldHint">
|
|
<Setter Property="FontSize" Value="11" />
|
|
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
|
|
<Setter Property="TextWrapping" Value="Wrap" />
|
|
<Setter Property="Margin" Value="0,2,0,0" />
|
|
</Style>
|
|
<Style Selector="Grid.fieldRow">
|
|
<Setter Property="Margin" Value="0,0,0,8" />
|
|
</Style>
|
|
</UserControl.Styles>
|
|
|
|
<ScrollViewer>
|
|
<ItemsControl Name="sections" Margin="16,0,16,16">
|
|
<ItemsControl.ItemTemplate>
|
|
<DataTemplate x:DataType="vm:SettingsSection">
|
|
<StackPanel>
|
|
<TextBlock Classes="sectionTitle" Text="{Binding Title}" />
|
|
|
|
<ItemsControl ItemsSource="{Binding Fields}">
|
|
<ItemsControl.DataTemplates>
|
|
|
|
<!-- Freitext -->
|
|
<DataTemplate DataType="vm:TextSettingsField">
|
|
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
|
|
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
|
|
<StackPanel Grid.Column="1">
|
|
<TextBox Text="{Binding Value, Mode=TwoWay}" IsEnabled="{Binding IsEditable}" />
|
|
<TextBlock Classes="fieldHint" Text="{Binding Description}"
|
|
IsVisible="{Binding HasDescription}" />
|
|
</StackPanel>
|
|
</Grid>
|
|
</DataTemplate>
|
|
|
|
<!-- Ganzzahl -->
|
|
<DataTemplate DataType="vm:IntSettingsField">
|
|
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
|
|
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
|
|
<StackPanel Grid.Column="1">
|
|
<TextBox Text="{Binding Value, Mode=TwoWay}" IsEnabled="{Binding IsEditable}"
|
|
MaxWidth="160" HorizontalAlignment="Left" />
|
|
<TextBlock Classes="fieldHint" Text="{Binding Description}"
|
|
IsVisible="{Binding HasDescription}" />
|
|
</StackPanel>
|
|
</Grid>
|
|
</DataTemplate>
|
|
|
|
<!-- Ja/Nein -->
|
|
<DataTemplate DataType="vm:BoolSettingsField">
|
|
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
|
|
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
|
|
<StackPanel Grid.Column="1">
|
|
<CheckBox IsChecked="{Binding Value, Mode=TwoWay}" IsEnabled="{Binding IsEditable}" />
|
|
<TextBlock Classes="fieldHint" Text="{Binding Description}"
|
|
IsVisible="{Binding HasDescription}" />
|
|
</StackPanel>
|
|
</Grid>
|
|
</DataTemplate>
|
|
|
|
<!-- Auswahl -->
|
|
<DataTemplate DataType="vm:ChoiceSettingsField">
|
|
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
|
|
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
|
|
<StackPanel Grid.Column="1">
|
|
<ComboBox ItemsSource="{Binding Options}"
|
|
SelectedItem="{Binding Value, Mode=TwoWay}"
|
|
IsEnabled="{Binding IsEditable}"
|
|
HorizontalAlignment="Stretch" />
|
|
<TextBlock Classes="fieldHint" Text="{Binding Description}"
|
|
IsVisible="{Binding HasDescription}" />
|
|
</StackPanel>
|
|
</Grid>
|
|
</DataTemplate>
|
|
|
|
<!-- Reine Anzeige -->
|
|
<DataTemplate DataType="vm:ReadOnlySettingsField">
|
|
<Grid Classes="fieldRow" ColumnDefinitions="210,*">
|
|
<TextBlock Grid.Column="0" Classes="fieldLabel" Text="{Binding Label}" />
|
|
<StackPanel Grid.Column="1">
|
|
<SelectableTextBlock Text="{Binding Value}" VerticalAlignment="Center"
|
|
Foreground="{DynamicResource AppReadOnlyTextBrush}" />
|
|
<TextBlock Classes="fieldHint" Text="{Binding Description}"
|
|
IsVisible="{Binding HasDescription}" />
|
|
</StackPanel>
|
|
</Grid>
|
|
</DataTemplate>
|
|
|
|
</ItemsControl.DataTemplates>
|
|
</ItemsControl>
|
|
</StackPanel>
|
|
</DataTemplate>
|
|
</ItemsControl.ItemTemplate>
|
|
</ItemsControl>
|
|
</ScrollViewer>
|
|
|
|
</UserControl>
|