PXAML-Pipeline

Die PXAML-Pipeline transformiert deklaratives UI-Markup in lauffähige Benutzeroberflächen.

Überblick

PXAML (Markup) → Parser → IR (JSON) → Renderer → GUI/TUI/Web

Phasen der Pipeline

Phase 1: Parsing

Der PXAML-Parser liest XML-Markup und erzeugt einen Abstract Syntax Tree (AST).

<!-- Input: PXAML -->
<Window Title="Demo" Width="400">
  <Button Content="Click me" Click="OnClick"/>
</Window>

Parser-Aufgaben:

  • XML-Validierung
  • Namespace-Auflösung
  • Element-Erkennung
  • Attribut-Parsing
  • Event-Bindung-Erkennung

Phase 2: IR-Generierung

Der AST wird in eine Intermediate Representation (IR) transformiert - ein JSON-basiertes Zwischenformat.

{
  "type": "Window",
  "properties": {
    "Title": { "value": "Demo", "type": "string" },
    "Width": { "value": 400, "type": "number" }
  },
  "children": [
    {
      "type": "Button",
      "properties": {
        "Content": { "value": "Click me", "type": "string" }
      },
      "events": {
        "Click": { "handler": "OnClick" }
      }
    }
  ]
}

IR-Eigenschaften:

  • Plattformunabhängig
  • Serialisierbar (JSON)
  • Diff-fähig für Hot Reload
  • Typ-Information erhalten

Phase 3: Binding-Auflösung

Data-Bindings werden analysiert und in ausführbare Strukturen umgewandelt.

<!-- PXAML mit Binding -->
<TextBox Text="{Binding Path=UserName, Mode=TwoWay}"/>
{
  "type": "TextBox",
  "properties": {
    "Text": {
      "type": "binding",
      "path": "UserName",
      "mode": "TwoWay"
    }
  }
}

Phase 4: Rendering

Die IR wird vom zielspezifischen Renderer in native UI-Elemente übersetzt.

Renderer Ausgabe Technologie
GUI Native Controls LCL/WinAPI
TUI Terminal-Zeichen ANSI/VT100
Web DOM-Elemente HTML/CSS

Komponenten

TWvdSPxamlParser

type
  TWvdSPxamlParser = class
  public
    function Parse(const ASource: string): TWvdSIRNode;
    function ParseFile(const APath: string): TWvdSIRNode;
  end;

TWvdSIRNode

type
  TWvdSIRNode = class
    NodeType: string;
    Properties: TWvdSPropertyMap;
    Children: TWvdSIRNodeList;
    Events: TWvdSEventMap;
    Bindings: TWvdSBindingList;
  end;

TWvdSRenderer (Abstrakt)

type
  TWvdSRenderer = class abstract
  public
    procedure Render(ARoot: TWvdSIRNode); virtual; abstract;
    procedure Update(AOldRoot, ANewRoot: TWvdSIRNode); virtual; abstract;
  end;

Hot Reload

Die Pipeline unterstützt Hot Reload durch IR-Differenzierung:

1. Neue PXAML → Parser → Neue IR
2. Diff(Alte IR, Neue IR) → Patch-Liste
3. Renderer.ApplyPatches(Patch-Liste)

Vorteile:

  • Nur geänderte Elemente werden aktualisiert
  • Zustand bleibt erhalten
  • Schnelle Iteration während der Entwicklung

Fehlerbehandlung

Fehlertyp Phase Behandlung
XML-Syntaxfehler Parsing Position + Meldung
Unbekanntes Element Parsing Warnung + Fallback
Ungültiger Property-Typ IR Type Coercion + Warnung
Binding-Fehler Binding Fallback-Wert

Siehe auch

Zuletzt geändert: den 29.01.2026 um 15:13