Avalonia-Grundgeruest: plattformneutrale App laeuft (Shell + erstes Fenster)
Neues Projekt src/PolyTrader.App.Avalonia (net10.0, Avalonia 12.1.1, LiveCharts2 2.0.5) - laeuft unter Windows und Linux aus derselben Quelle. Enthalten: - Program.cs mit bewusst getrenntem Aufbau: BuildHost() stellt Persistenz, Dienste und Module ohne jeden UI-Bezug zusammen, erst Main haengt Avalonia daran. Damit ist der kopflose Linux-Betrieb (--headless, Stufe L2) ohne Umbau erreichbar - der Schalter ist bereits drin. - AvaloniaUiHost als IModuleUiHost: gleiche Semantik wie die WinForms-Shell (ein Fenster je View, offene nach vorn holen, alles maximiert). - Fenster-Menueleiste vollstaendig DEKLARATIV (Controls/WindowMenuBar.axaml + ItemsSource auf WindowMenuModel.Entries). Loest die alte Fassung ab, die menu.Items zur Laufzeit leerte und neu befuellte - genau der Punkt, den die neue Layout-Regel verbietet. - ViewIcons fuer Avalonia: dieselben Schluessel und dieselben PNGs wie zuvor, Core und Module bleiben unveraendert. - LauncherWindow, JobsWindow, ShutdownConfirmWindow (inkl. der 10-Sekunden-Sperre). - --smoke-ui als Nachfolger der WinForms-Konstruktionspruefung; startet den Host bewusst NICHT, damit ein reiner UI-Test nicht die Trading-Engine gegen echte Endpunkte anwirft. Dabei aufgeraeumt: - JobManager.Jobs: BindingList -> ObservableCollection. BindingList implementiert kein INotifyCollectionChanged; neu registrierte Jobs waeren in Avalonia unsichtbar geblieben. - StartupHydrationService aufgeteilt in CoreStateHydrationService (Core: Accounts + Demo-Positionen) und CopyTradingHydrationService (Modul: Settings + Trader). Behebt einen latenten Fehler: bei deaktiviertem Copytrading-Modul waeren die Accounts gar nicht mehr hydriert worden, obwohl sie zum Core gehoeren. Verifiziert: Solution baut, 442 Tests gruen, --smoke-ui gruen, die App laeuft real mit Fenster und allen Trading-Diensten (Market-Sync, Master-Trader-Analyse, RF-Scanner), und publisht fuer linux-x64. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
<Window xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:controls="using:PolyTrader.App.Avalonia.Controls"
|
||||
xmlns:shell="using:PolyTrader.App.Avalonia.Shell"
|
||||
x:Class="PolyTrader.App.Avalonia.Views.LauncherWindow"
|
||||
Title="PolyTrader"
|
||||
Width="1600" Height="700"
|
||||
WindowState="Maximized">
|
||||
|
||||
<!--
|
||||
„Startleiste" der Anwendung. Entspricht der bisherigen LauncherForm:
|
||||
oben die gemeinsame Fenster-Menüleiste, darunter die Schnellaktionen (Trading-Modi),
|
||||
dann die Fenster-Buttons, unten die Statusleiste.
|
||||
|
||||
Die Fenster-Buttons sind bewusst datengebunden (ItemsControl über die registrierten Views)
|
||||
statt einzeln im Layout festgeschrieben: die WinForms-Fassung hatte je Modul einen fest
|
||||
verdrahteten Button, der bei fehlendem Modul deaktiviert wurde. Über die Bindung erscheinen
|
||||
genau die Fenster, die es wirklich gibt — das ist robuster und bleibt trotzdem deklarativ.
|
||||
-->
|
||||
<DockPanel>
|
||||
<controls:WindowMenuBar Name="menuBar" DockPanel.Dock="Top" />
|
||||
|
||||
<Border Classes="toolbar" DockPanel.Dock="Top">
|
||||
<StackPanel Orientation="Horizontal" Spacing="4">
|
||||
<Button Name="btnLiveTrading" Content="LiveTrading (—)" MinWidth="170" />
|
||||
<Button Name="btnDemoTrading" Content="DemoTrading (—)" MinWidth="170" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border Classes="statusbar" DockPanel.Dock="Bottom">
|
||||
<StackPanel Orientation="Horizontal" Spacing="24">
|
||||
<TextBlock Name="lblTrading" Text="Trading: —" />
|
||||
<TextBlock Name="lblModules" Text="Module: —" />
|
||||
<TextBlock Name="lblRatelimit" Text="API: —" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<ScrollViewer>
|
||||
<StackPanel Margin="12" Spacing="16">
|
||||
<TextBlock Text="Fenster" FontSize="14" FontWeight="SemiBold" />
|
||||
|
||||
<ItemsControl Name="windowButtons">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<WrapPanel Orientation="Horizontal" />
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="shell:WindowMenuEntry">
|
||||
<Button Command="{Binding Command}"
|
||||
MinWidth="190" MinHeight="56"
|
||||
Margin="0,0,8,8"
|
||||
HorizontalContentAlignment="Left">
|
||||
<StackPanel Orientation="Horizontal" Spacing="10">
|
||||
<Image Source="{Binding Icon}" Width="28" Height="28"
|
||||
VerticalAlignment="Center"
|
||||
IsVisible="{Binding Icon, Converter={x:Static ObjectConverters.IsNotNull}}" />
|
||||
<StackPanel VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding Title}" FontWeight="{Binding FontWeight}" />
|
||||
<TextBlock Text="{Binding CheckMark}" FontSize="11" Foreground="#2E7D32" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
|
||||
<TextBlock Name="lblPortInfo"
|
||||
Foreground="#996600"
|
||||
TextWrapping="Wrap"
|
||||
Text="Portierung läuft: Dashboard, Terminal, Einstellungen und die Modul-Fenster werden noch auf Avalonia umgestellt. Die Trading-Dienste laufen davon unabhängig." />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</DockPanel>
|
||||
|
||||
</Window>
|
||||
Reference in New Issue
Block a user