# UI-Spezifikation der WinForms-Oberfläche (Rekonstruktionsvorlage für Avalonia) **Stand:** 06.08.2026 · **Zweck:** Die WinForms-UI wird im Zuge der Linux-Portierung entfernt. Dieses Dokument hält fest, **wie sie aussah und was sie konnte**, damit die Avalonia-Umsetzung so nah wie möglich am Original bleibt. > **Der Originalcode ist nicht verloren.** Der Git-Tag **`winforms-final`** enthält den vollständigen > letzten Stand. Auschecken und ansehen: > > ```bash > git checkout winforms-final > ``` > > Dieses Dokument ist die *lesbare Zusammenfassung* — für Details (Pixelabstände, Andockung, > Farbwerte) immer in den Tag schauen. Die Angaben unten sind maschinell aus den > `.Designer.cs`-Dateien extrahiert, also exakt und nicht aus dem Gedächtnis rekonstruiert. ## Screenshots — bitte einmal selbst anlegen Was dieses Dokument **nicht** leisten kann, ist der optische Gesamteindruck: Proportionen, Abstände, Farbwirkung, wie voll die Fenster im Alltag aussehen. Dafür lohnt sich einmalig: ```bash git checkout winforms-final ``` Dann die App starten, jedes Fenster **mit echten Daten** öffnen und einen Screenshot ablegen (Vorschlag: `docs/ui-referenz/.png`). Zehn Minuten Arbeit, die beim Nachbau mehr wert sind als jede Beschreibung. Danach mit `git checkout main` zurück. --- ## Übergreifende Gestaltungsregeln Diese Muster ziehen sich durch alle Fenster und sollten in Avalonia erhalten bleiben: | Regel | Umsetzung in WinForms | Entsprechung in Avalonia | |---|---|---| | **Alle Fenster maximiert öffnen** | `WindowState = Maximized`, `StartPosition = CenterScreen` (`ShellUiHost.OpenView`) | `WindowState="Maximized"` | | **Gemeinsame Fenster-Menüleiste** auf JEDEM Fenster | `WindowMenu.Wire()` hängt oben einen `MenuStrip` an; alle Fenster nebeneinander mit Icon, aktuelles fett + angehakt | `Menu` mit `ItemsSource`-Bindung (deklarativ!) | | **Rechte Menüaktion kontextabhängig** | Launcher → „Beenden" (mit Sicherheitsabfrage); alle anderen Fenster → „Fenster schließen" | `DockPanel` — Avalonia kennt kein `ToolStripItemAlignment.Right` | | **Ein Fenster je View** | `ShellUiHost` hält höchstens eine Instanz, holt sie sonst nach vorn | gleiche Logik; der Contract ist bereits toolkit-neutral | | **Zahlenformate in Tabellen** | `DefaultCellStyle.Format` (`N2`, `N1`, …) | `Binding StringFormat` | | **Schriftart** | „Segoe UI" (21×), Terminal „Consolas" (1×) | Systemschrift + Monospace-Fallback — Segoe UI gibt es auf Linux nicht | | **Zeilenfärbung nach PnL** | `TradeRowColoring` lieferte die Farbe direkt in `DefaultCellStyle.BackColor` | bereits umgestellt: Logik liefert `TradeRowTint`, die UI mappt auf Farbe | **Farbwerte der Zeilenfärbung** (aus `TradeRowPalette` — unverändert übernehmen): | Kategorie | RGB | Bedeutung | |---|---|---| | `Loss` | 245, 200, 200 | < 0 % — rot | | `SmallWin` | 212, 240, 212 | 0–10 % — hellgrün | | `BigWin` | 140, 214, 140 | > 10 % — grün | **Symbol-Schlüssel je Fenster** (siehe `Ui/ViewIcons.cs` — die Schlüssel bleiben gültig): | View-ID | Schlüssel | Bildressource | |---|---|---| | `core.dashboard` | `dashboard` | dashboard.png | | `core.settings` | `settings` | setting_tools.png | | `core.terminal` | `terminal` | error_log.png | | `core.jobs` | `jobs` | system_time.png | | `copytrading.main` | `copytrading` | cross_reference.png | | `resolutionfarming.main` | `resolutionfarming` | file_start_workflow.png | | `supervisor.main` | `supervisor` | emotion_batman.png | | `accounting.main` | `accounting` | coins_in_hand.png | Die PNG-Dateien liegen weiterhin in `Resources/` und können unverändert weiterverwendet werden. --- ## A. Modul-Fenster (in diesem Schritt entfernt) ### CopyTradingMainForm — Hauptfenster Copytrading **Fenstergröße:** 1714 × 1167 px **Tabs (Reihenfolge):** Master-Trader | Offene Trades | Geschlossene Trades | Account-Einstellungen **Steuerelemente:** TabPage ×4, TabControl ×1, MasterTradersView ×1, OpenTradesView ×1, ClosedTradesView ×1, AccountSettingsView ×1 ### MasterTradersView — Tab „Master-Trader“ **Tabellenspalten** (Reihenfolge = Anzeigereihenfolge): | # | Spaltenkopf | Feldname | Format | Breite | |--:|---|---|---|---| | 1 | # | `colId` | — | 50 px | | 2 | Wallet | `colWallet` | — | 170 px | | 3 | Name | `colName` | — | Rest/Auto | | 4 | Kategorie | `colCategory` | — | 110 px | | 5 | Aktiv | `colActive` | — | 50 px | | 6 | Trades (7T) | `colTrades` | — | 90 px | | 7 | Winrate % | `colWinrate` | — | 90 px | | 8 | PnL (7T) | `colPnl` | — | 100 px | | 9 | Copy-PnL (30T) | `colCopyPnl` | — | 110 px | | 10 | Profit-Faktor | `colCopyPf` | — | 100 px | | 11 | Ø PnL/Trade | `colCopyAvg` | — | 100 px | | 12 | Copy-Trades | `colCopyCount` | — | 90 px | **Steuerelemente:** DataGridViewTextBoxColumn ×11, ToolStripButton ×4, Panel ×2, ToolStrip ×1, ToolStripSeparator ×1, DataGridView ×1, DataGridViewCheckBoxColumn ×1, Splitter ×1, PropertyGrid ×1, GroupBox ×1, CheckedListBox ×1, Label ×1 ### OpenTradesView — Tab „Offene Trades“ **Beschriftungen:** - `lblSummary` = „—" **Tabellenspalten** (Reihenfolge = Anzeigereihenfolge): | # | Spaltenkopf | Feldname | Format | Breite | |--:|---|---|---|---| | 1 | Account | `colAccount` | — | Fill 120 | | 2 | Master-Trader | `colTrader` | — | Fill 120 | | 3 | Markt | `colMarket` | — | Fill 240 | | 4 | Outcome | `colOutcome` | — | Fill 80 | | 5 | Side | `colSide` | — | Fill 55 | | 6 | Entry | `colEntry` | — | Fill 65 | | 7 | Aktuell | `colCurrent` | — | Fill 65 | | 8 | Size | `colSize` | — | Fill 70 | | 9 | Einsatz | `colAmount` | — | Fill 80 | | 10 | Wert | `colValue` | — | Fill 80 | | 11 | Buchgewinn | `colUnrealized` | — | Fill 90 | | 12 | Buchgew. % | `colUnrealizedPct` | — | Fill 80 | | 13 | Status | `colStatus` | — | Fill 90 | **Steuerelemente:** DataGridViewTextBoxColumn ×13, ToolStrip ×1, ToolStripButton ×1, DataGridView ×1, Panel ×1, Label ×1 ### ClosedTradesView — Tab „Geschlossene Trades“ **Beschriftungen:** - `lblSummary` = „—" - `lblMarkt` = „Markt:" - `lblMaster` = „Master:" - `lblErgebnis` = „Ergebnis:" - `lblVon` = „Von:" - `lblBis` = „Bis:" **Schaltflächen:** „Zurücksetzen" **Tabellenspalten** (Reihenfolge = Anzeigereihenfolge): | # | Spaltenkopf | Feldname | Format | Breite | |--:|---|---|---|---| | 1 | # | `colTradeId` | — | 60 px | | 2 | Account | `colAccount` | — | 130 px | | 3 | Master-Trader | `colTrader` | — | 130 px | | 4 | Markt | `colMarket` | — | Rest/Auto | | 5 | Outcome | `colOutcome` | — | 80 px | | 6 | Side | `colSide` | — | 60 px | | 7 | Entry | `colEntry` | — | 70 px | | 8 | Exit | `colExit` | — | 70 px | | 9 | Size | `colSize` | — | 70 px | | 10 | PnL | `colPnl` | — | 80 px | | 11 | PnL % | `colPnlPct` | — | 70 px | | 12 | Eröffnet | `colOpenedAt` | — | 130 px | | 13 | Geschlossen | `colClosedAt` | — | 130 px | **Steuerelemente:** DataGridViewTextBoxColumn ×13, Label ×6, Panel ×2, ComboBox ×2, DateTimePicker ×2, ToolStrip ×1, ToolStripButton ×1, DataGridView ×1, TextBox ×1, Button ×1 ### AccountSettingsView — Tab „Account-Einstellungen“ **Steuerelemente:** ToolStrip ×1, ToolStripLabel ×1, ToolStripComboBox ×1, ToolStripSeparator ×1, ToolStripButton ×1, PropertyGrid ×1, Panel ×1, Label ×1 ### ResolutionFarmingMainForm **Fenstergröße:** 1429 × 1030 px **Tabs (Reihenfolge):** Kandidaten | Positionen | Historie / Statistik | Settings **Beschriftungen:** - `lblCandKonto` = „Konto:" - `lblSetKonto` = „Konto:" **Schaltflächen:** „Aktualisieren", „Speichern" **Steuerelemente:** TabPage ×4, Panel ×4, Label ×4, Button ×4, DataGridView ×3, ComboBox ×2, TabControl ×1, PropertyGrid ×1 ### SupervisorMainForm **Fenstergröße:** 1786 × 1163 px **Tabs (Reihenfolge):** Analyse | Dossiers | Berichte | Counterfactual **Beschriftungen:** - `lblProfil` = „Profil:" - `lblModel` = „Modell:" - `lblSignal` = „SignalId:" **Schaltflächen:** „Aktualisieren", „Dossier öffnen", „Senden", „Verlauf leeren" **Steuerelemente:** ToolStripButton ×5, TabPage ×4, ToolStrip ×4, ToolStripLabel ×3, TextBox ×3, DataGridView ×3, ToolStripTextBox ×2, ToolStripSeparator ×2, SplitContainer ×2, TabControl ×1, ToolStripComboBox ×1, RichTextBox ×1, Panel ×1, Button ×1, Label ×1 ### AccountingMainForm **Fenstergröße:** 1571 × 1067 px **Tabs (Reihenfolge):** Übersicht / BWA | Ledger | Abruf / Status **Beschriftungen:** - `lblKpiNet` = „Netto-Handelsergebnis ↵ —" - `lblKpiClosing` = „Endsaldo ↵ —" - `lblKpiDeposits` = „Einzahlungen ↵ —" - `lblKpiWithdrawals` = „Auszahlungen ↵ —" - `lblKpiFees` = „Fees ↵ —" - `lblKpiRewards` = „Rewards ↵ —" - `lblKpiVolume` = „Handelsvolumen ↵ —" - `lblKpiTrades` = „Trades ↵ —" - `lblWaehrung` = „Währung:" - `lblBis` = „Bis:" - `lblVon` = „Von:" - `lblOvKonto` = „Konto:" - `lblLedgerKonto` = „Konto:" - `lblStatusKonto` = „Konto:" **Schaltflächen:** „Aktualisieren", „Backfill (volle Historie)", „Berechnen", „CSV-Export", „Inkrement jetzt", „PDF-Export" **Steuerelemente:** Label ×13, ToolStripButton ×4, TabPage ×3, Button ×3, DataGridView ×3, ToolStripSeparator ×3, ComboBox ×2, DateTimePicker ×2, ToolStrip ×2, ToolStripLabel ×2, ToolStripComboBox ×2, TabControl ×1, Panel ×1, FlowLayoutPanel ×1 --- ## B. Core-/Shell-Fenster (bleiben vorerst bestehen) ### LauncherForm — Startleiste **Fenstergröße:** 2599 × 669 px **Beschriftungen:** - `lbl_trading` = „Trading: —" - `lbl_modules` = „Module: —" - `lbl_ratelimit` = „API: —" **Schaltflächen:** „API: —", „Accounting", „CopyTrading", „Dashboard", „DemoTrading (—)", „LiveTrading (—)", „ResolutionFarming", „Server Jobs", „Settings", „Supervisor", „Terminal / Logs" **Tabellenspalten** (Reihenfolge = Anzeigereihenfolge): | # | Spaltenkopf | Feldname | Format | Breite | |--:|---|---|---|---| | 1 | Account | `colAccName` | — | 113 px | | 2 | Module | `colAccModules` | — | 109 px | | 3 | Polymarket | `colAccPoly` | — | 106 px | | 4 | Wallet (USDC) | `colAccBalance` | — | 157 px | | 5 | 3T PnL | `colAccPnl3d` | — | Rest/Auto | | 6 | 3T Winrate % | `colAccWin3d` | — | 153 px | | 7 | Overall P/L | `colAccOverall` | — | 133 px | **Steuerelemente:** ToolStripButton ×10, DataGridViewTextBoxColumn ×6, ToolStripStatusLabel ×3, ToolStrip ×2, ToolStripSeparator ×2, MenuStrip ×1, StatusStrip ×1, DataGridView ×1, DataGridViewButtonColumn ×1, LauncherWidgetsPanel ×1 ### LauncherWidgetsPanel — Live-Überblick **Tabs (Reihenfolge):** Auffällige Trades (24h) **Tabellenspalten** (Reihenfolge = Anzeigereihenfolge): | # | Spaltenkopf | Feldname | Format | Breite | |--:|---|---|---|---| | 1 | Zeit | `colAlertTime` | — | 70 px | | 2 | Level | `colAlertLevel` | — | 70 px | | 3 | Nachricht | `colAlertMsg` | — | Rest/Auto | | 4 | Modul | `colNotModule` | — | 100 px | | 5 | Markt | `colNotMarket` | — | Rest/Auto | | 6 | PnL | `colNotPnl` | — | 80 px | | 7 | PnL % | `colNotPnlPct` | — | 70 px | **Steuerelemente:** DataGridViewTextBoxColumn ×7, GroupBox ×3, DataGridView ×2, TableLayoutPanel ×1, FlowLayoutPanel ×1, RichTextBox ×1 ### DashboardView **Fenstergröße:** 1714 × 1083 px **Tabs (Reihenfolge):** Dashboard | Tradehistorie | Module **Beschriftungen:** - `lblKpiPnl` = „Netto-PnL ↵ —" - `lblKpiWin` = „Winrate ↵ —" - `lblKpiTrades` = „Trades ↵ —" - `lblKpiAvg` = „Ø PnL/Trade ↵ —" - `lblKpiPf` = „Profit-Faktor ↵ —" - `lblErgebnis` = „Ergebnis:" - `lblSuche` = „Suche:" - `lblModulesInfo` = „Module aktivieren/deaktivieren. Änderungen greifen nach dem nächsten Neustart von PolyTrader." **Tabellenspalten** (Reihenfolge = Anzeigereihenfolge): | # | Spaltenkopf | Feldname | Format | Breite | |--:|---|---|---|---| | 1 | Modul | `colModule` | — | 110 px | | 2 | Konto | `colAccount` | — | 130 px | | 3 | Markt | `colMarket` | — | Rest/Auto | | 4 | Outcome | `colOutcome` | — | 80 px | | 5 | Side | `colSide` | — | 60 px | | 6 | Entry | `colEntry` | — | 70 px | | 7 | Exit | `colExit` | — | 70 px | | 8 | Size | `colSize` | — | 70 px | | 9 | PnL | `colPnl` | — | 80 px | | 10 | PnL % | `colPnlPct` | — | 70 px | | 11 | Geschlossen | `colClosedAt` | — | 140 px | | 12 | Modul | `colModName` | — | 220 px | | 13 | Status | `colModStatus` | — | 260 px | | 14 | Hinweis | `colModHint` | — | Rest/Auto | | 15 | Aktion | `colModAction` | — | 160 px | **Steuerelemente:** DataGridViewTextBoxColumn ×14, Label ×8, ToolStripLabel ×4, ToolStripComboBox ×4, TabPage ×3, PictureBox ×3, Panel ×2, DataGridView ×2, ToolStrip ×1, ToolStripButton ×1, TabControl ×1, FlowLayoutPanel ×1, TextBox ×1, ComboBox ×1, DataGridViewButtonColumn ×1 ### TerminalView **Fenstergröße:** 1429 × 1083 px **Tabs (Reihenfolge):** Live | Log Viewer **Beschriftungen:** - `lblFilter` = „Level:" - `lblViewerStatus` = „—" - `lblVText` = „Text:" - `lblVCid` = „CID:" - `lblVLevel` = „Level:" - `lblVDatum` = „Datum:" **Schaltflächen:** „Alles auswählen", „Alles kopieren", „Kopieren", „Laden", „Stop Autoscroll", „Terminal leeren" **Steuerelemente:** Label ×6, ToolStripMenuItem ×4, DataGridViewTextBoxColumn ×4, TabPage ×2, Panel ×2, ComboBox ×2, Button ×2, TextBox ×2, TabControl ×1, RichTextBox ×1, ContextMenuStrip ×1, ToolStripSeparator ×1, DateTimePicker ×1, DataGridView ×1 ### SettingsView **Fenstergröße:** 1185 × 820 px **Tabs (Reihenfolge):** General Settings | Polymarket Accounts **Schaltflächen:** „Lizenz prüfen / setzen …", „Load Settings from File", „Löschen", „Master-Key erzeugen", „Neuer Account", „OpenRouter-Key setzen …", „Save Changes", „Test-Heartbeat senden", „Watchdog-Token setzen …" **Steuerelemente:** ToolStripButton ×9, PropertyGrid ×2, TabPage ×2, ToolStrip ×2, DataGridViewTextBoxColumn ×2, DataGridViewCheckBoxColumn ×2, TabControl ×1, DataGridView ×1 ### JobsView **Fenstergröße:** 1429 × 833 px **Tabellenspalten** (Reihenfolge = Anzeigereihenfolge): | # | Spaltenkopf | Feldname | Format | Breite | |--:|---|---|---|---| | 1 | Job Name | `colJobName` | — | 150 px | | 2 | Status | `colStatus` | — | 150 px | | 3 | Zuletzt ausgeführt | `colLastRun` | — | 130 px | | 4 | Nächster Lauf | `colNextRun` | — | 130 px | | 5 | Aktiv | `col_dgv_jobs_Enabled` | — | 60 px | | 6 | Aktion | `col_dgv_jobs_Run` | — | 90 px | | 7 | Beschreibung | `colDescription` | — | Rest/Auto | **Steuerelemente:** DataGridViewTextBoxColumn ×5, DataGridView ×1, DataGridViewCheckBoxColumn ×1, DataGridViewButtonColumn ×1, ToolStrip ×1, ToolStripButton ×1 ### LicenseDialog **Beschriftungen:** - `lblHeadline` = „Für PolyTrader wird eine gültige Lizenz benötigt." - `lblStatus` = „Status:" - `lblHwCaption` = „Hardware-ID dieses Rechners (für die Aktivierung):" - `lblKeyCaption` = „Lizenzschlüssel:" **Schaltflächen:** „Kopieren", „Ohne Lizenz starten (eingeschränkt)", „Validieren" **Steuerelemente:** Label ×5, Button ×3, TextBox ×2 ### ShutdownConfirmDialog **Beschriftungen:** - `lblTitle` = „PolyTrader sicher beenden?" - `lblCountdown` = „Beenden möglich in 10 s …" **Schaltflächen:** „Abbrechen", „Beenden (10 s)" **Steuerelemente:** Label ×3, Button ×2, Timer ×1 --- ## Verhaltensnotizen aus dem Code-Behind Was die Designer-Dateien nicht zeigen — Verhalten, das beim Nachbau leicht untergeht: ### Copytrading - **MasterTradersView**: Links das Grid, rechts ein `PropertyGrid` für den gewählten Trader, darunter eine `CheckedListBox` „Zugewiesene Accounts". Getrennt durch einen `Splitter`. Nach dem Speichern erscheint ein Hinweistext mit Uhrzeit: „Gespeichert: #ID Name (n Account(s)) um HH:mm:ss". - **OpenTradesView / ClosedTradesView**: Die Zeilenfärbung wird bei `DataBindingComplete` neu gesetzt. Unter dem Grid zeigt eine Zusammenfassungszeile (`lblSummary`) die Summen. - **ClosedTradesView**: Filterleiste mit Markt-Suche, Master-Auswahl, Ergebnis-Auswahl (Alle / Gewinner / Verlierer) und Datumsbereich; dazu „Zurücksetzen". - **AccountSettingsView**: Konto-Auswahl in der Toolbar, darunter ein `PropertyGrid` auf `CopyTradingAccountSettings`. **Die `[Description]`-Attribute der Modellklasse sind die Feldbeschreibungen — beim Nachbau als Tooltips oder Hilfetexte übernehmen.** ### ResolutionFarming Vier Tabs (Kandidaten / Positionen / Historie + Statistik / Settings), je ein Grid mit einer „Aktualisieren"-Schaltfläche und Konto-Auswahl oben. Der Settings-Tab zeigt ein `PropertyGrid` plus „Speichern" mit Bestätigungstext samt Uhrzeit. ### Supervisor - **Analyse-Tab**: chat-artig — `RichTextBox` für den Verlauf (je Eintrag Zeitstempel + Sprecher), Eingabefeld, „Senden", „Verlauf leeren"; Profil- und Modellauswahl in der Toolbar. - **Dossiers-Tab**: Grid plus „Dossier öffnen". - **Berichte / Counterfactual**: Grid plus „Aktualisieren", Filterung über `SignalId`. ### Accounting - Drei Tabs: Übersicht/BWA, Ledger, Abruf/Status. - **KPI-Kacheln** in einem `FlowLayoutPanel`: Netto-Handelsergebnis, Endsaldo, Einzahlungen, Auszahlungen, Fees, Rewards, Handelsvolumen, Trades. Format je Kachel zweizeilig: `"\n "` — der Wert steht unter dem Titel. - Zeitraumwahl über zwei `DateTimePicker` (Von/Bis), dazu Währungs- und Kontoauswahl. - Export über „PDF-Export" und „CSV-Export"; im Status-Tab „Inkrement jetzt" und „Backfill (volle Historie)". ### Shell - **LauncherForm**: Startleiste mit einem Button je Fenster (angehakt, wenn das Fenster offen ist), Schnellaktionen „LiveTrading" und „DemoTrading" (dreistufig: Inactive → SellOnly → Active), Statuszeile mit Trading-Status, Modul-Status und API-Ratelimit. Darunter die Account-Übersicht und der Live-Überblick (`LauncherWidgetsPanel`). - **Das Schließen-X ist abgefangen** und läuft über dieselbe Sicherheitsabfrage wie „Beenden". - **ShutdownConfirmDialog**: Die Beenden-Schaltfläche ist **10 Sekunden gesperrt**, mit Countdown im Text („Beenden möglich in 10 s"); Abbrechen ist jederzeit möglich. - **TerminalView**: Live-Tab mit farbigen Log-Zeilen und abschaltbarem Autoscroll, Kontextmenü (Alles auswählen / Alles kopieren), Auto-Clear bei Erreichen der RAM-Grenze. Log-Viewer-Tab mit Filtern über Datum, Level, CID und Volltext. - **DashboardView**: KPI-Kacheln (Netto-PnL, Winrate, Trades, Ø PnL/Trade, Profit-Faktor), drei Diagramme (Equity-Kurve, PnL je Modul, PnL je Tag), Tradehistorie mit Suche und Gewinner/Verlierer-Filter sowie ein Modul-Tab zum Aktivieren/Deaktivieren (wirkt nach Neustart). **Der Profit-Faktor zeigt „∞", wenn es keine Verluste gab.** --- ## Was beim Nachbau bewusst *anders* werden darf Nicht alles ist erhaltenswert — diese Punkte sind Altlasten der WinForms-Umsetzung: 1. **Die `PropertyGrid`-Fenster** (Settings, Account-Einstellungen, Master-Trader, ResolutionFarming): statt einer alphabetischen Reflection-Liste künftig fachlich gruppierte Formulare mit Validierung, Einheiten am Feld und abhängigen Feldern. Die `[Description]`-Attribute liefern die Texte, die `[Browsable(false)]`-Markierungen die auszublendenden Felder. 2. **Menüaufbau zur Laufzeit** (`WindowMenu.Populate` leert und füllt `menu.Items`): verstößt gegen die neue Layout-Regel. In Avalonia ein deklaratives `Menu` mit `ItemsSource`-Bindung. 3. **Diagramme als Bitmap** (ScottPlot → PNG → `PictureBox`): entfällt mit LiveCharts2. 4. **Das `RichTextBox`-Terminal**: als virtualisiertes `ItemsControl` über eine `ObservableCollection` neu bauen — das löst nebenbei das RAM-Problem, wegen dem heute ein Auto-Clear nötig ist. 5. **Feste Pixelbreiten** in den Grids: in Avalonia besser mit `*`-Sternbreiten arbeiten. Die Werte in den Tabellen oben geben die *Proportionen* vor, nicht die absoluten Zahlen.