WinForms und WPF zu Avalonia mit derselben sgcUI-API

sgcUI liefert native Steuerelemente für WinForms, WPF und Avalonia, die pro Produkt ein Modell teilen. Die Grid-Spalten, das Diagramm, die Planner-Daten und das Theme werden einmal geschrieben und lassen sich unverändert für jeden Host kompilieren. Einen Bildschirm nach Avalonia zu verschieben, und damit auch nach macOS und Linux, heißt also, den Fenstercode und die Steuerelementtypen zu ändern, nicht die Bildschirmlogik. Dieses Kit zeigt wie, mit Code aus einem Beispiel, das sich kompilieren lässt und seinen Selbsttest auf allen drei Hosts besteht.

Eine Windows-Desktopanwendung, die unter macOS und Linux laufen muss

Fachanwendungs-Bildschirme mit Grids, Diagrammen und Plantafeln, eine Datenschicht, die Sie behalten möchten, und keine Lust, die Bildschirmlogik in einem neuen UI-Framework neu zu schreiben.

Von WinForms

WinForms läuft nur unter Windows. Mit sgcUI haben die TsgcWinForms*-Steuerelemente, die Sie heute verwenden, TsgcAvalonia*-Gegenstücke mit denselben Mitgliedern. Der Konfigurationscode wandert in eine gemeinsame Klassenbibliothek, das Formular wird zu einem Avalonia-Fenster, und DataSource wird zu ItemsSource.

Von WPF

Auch WPF läuft nur unter Windows. Seine sgcUI-Steuerelemente sind Avalonia am ähnlichsten: Beide binden mit ItemsSource, beide werden in XAML mit demselben sgc-Namespace-URI deklariert, und der Aufruf des UI-Threads ist die wichtigste Codeänderung.

Der übliche Weg für eine bestehende WPF-Anwendung ist Avalonia XPF, das sein Anbieter beschreibt als "a binary-compatible WPF runtime" und "a fork of WPF that maintains API and binary compatibility across the managed surface area". Zum Zeitpunkt des Schreibens (20.10.2026) wird XPF als unbefristete Lizenz pro Anwendung mit zwölf Monaten Updates und Support verkauft: Internal für EUR 9.500 pro App (Bereitstellung nur für eigene Mitarbeiter), Business für EUR 29.500 pro App (kommerzielle Bereitstellung unter macOS und Desktop-Linux, Embedded Linux als Zusatz für EUR 21.250) und Enterprise ab EUR 124.500 pro App für Mobilgeräte oder den Browser. WPF-Suiten von Drittanbietern können unter bestimmten Bedingungen auf XPF laufen: Die XPF-Hinweise zu Bibliotheken von Drittanbietern nennen Win32-API-Shims als "required for DevExpress controls", dass einige DevExpress-Steuerelemente von System.Drawing.Common (GDI+) abhängen, "which is deprecated on non-Windows platforms", dass DevExpress-Steuerelemente unter Linux libgdiplus benötigen und dass "Issues most commonly arise with controls that use GDI or WinForms components". Avalonia selbst ist ein kostenloses, MIT-lizenziertes UI-Framework. sgcUI für .NET wird pro Entwickler lizenziert, ab €380 für die Edition .NET Standard, mit vollständigem C#-Quellcode für WinForms, WPF und Avalonia, kostenloser Weitergabe der Binärdateien und ohne Gebühr pro Anwendung. Kostenlose Community-Pakete gibt es auf NuGet.

Ein Modell, drei dünne Hosts

Jedes sgcUI-Produkt hat ein Modell, das nichts vom Host weiß. Die Steuerelemente für WinForms, WPF und Avalonia sind dünne Ansichten darauf.

Gemeinsame Modelle

TsgcGridColumns, TsgcGridData, TsgcChart, TsgcPlannerData, TsgcPlannerSchedulerOptions, TsgcPivotEngine und TsgcDiagramDocument sind auf den drei Hosts dieselben Typen. Code, der dagegen geschrieben wird, lässt sich für jeden unverändert kompilieren.

Dieselben Mitgliedsnamen

Columns, Data, ShowFooter, GroupSummaries, GroupBy, SaveLayoutToString, LoadLayoutFromString, Chart, Options, View, Date, PrintSettings, CreatePrintSource, Print, ShowPrintPreview und ExportToPDF, dazu die Grid-Ereignisse wie OnCellClick, OnSelectionChange und OnSortChange.

Dasselbe gespeicherte Layout

Ein mit SaveLayoutToString gespeichertes Grid-Layout ist auf jedem Host derselbe JSON-Text. Im Beispiel schreiben die drei Hosts ihr Layout in eine Datei, und die drei Dateien haben dasselbe SHA-256. Auch Themes (TsgcUITheme, sgcUIApplication.Theme, sgcUIApplication.AccentColor, hoher Kontrast) werden geteilt.

Das Host-Steuerelement jedes Produkts

Die Faustregel: Ersetzen Sie das Präfix TsgcWinForms oder TsgcWpf durch TsgcAvalonia. Die Ausnahmen sind in der Tabelle markiert.

Produkt WinForms WPF Avalonia
sgcGridTsgcWinFormsGridTsgcWpfGridTsgcAvaloniaGrid
sgcGrid, deklarierte Spalteim Code, Columns.AddTsgcWpfGridColumn (XAML)TsgcAvaloniaGridColumn (XAML)
sgcChartsTsgcWinFormsChart, TsgcWinFormsChartEditorTsgcWpfChart, TsgcWpfChartEditorTsgcAvaloniaChart, TsgcAvaloniaChartEditor
sgcPivotGridTsgcWinFormsPivotGrid, TsgcWinFormsPivotFieldListTsgcWpfPivotGrid, TsgcWpfPivotFieldListTsgcAvaloniaPivotGrid, TsgcAvaloniaPivotFieldList
sgcPlannerTsgcWinFormsScheduler, TsgcWinFormsGantt, TsgcWinFormsKanbanTsgcWpfScheduler, TsgcWpfGantt, TsgcWpfKanbanTsgcAvaloniaScheduler, TsgcAvaloniaGantt, TsgcAvaloniaKanban
sgcDiagramTsgcWinFormsDiagramView, TsgcWinFormsDiagramPalette, TsgcWinFormsDiagramMinimapTsgcWpfDiagramView, TsgcWpfDiagramPalette, TsgcWpfDiagramMinimapTsgcAvaloniaDiagramView, TsgcAvaloniaDiagramPalette, TsgcAvaloniaDiagramMinimap
sgcGaugesTsgcWinForms<Kind>GaugeTsgcWpf<Kind>GaugeTsgcAvalonia<Kind>Gauge
Kind ist Radial, Linear, Digital, Compass, Clock, LED, LEDBar, ProgressRing, VUMeter oder Annunciator.
sgcDashboardTsgcWinFormsDashboardTsgcWpfDashboardTsgcAvaloniaDashboard
sgcDashboard-KachelnTsgcWinFormsDashboardTile, ...ChartTile, ...GridTile, ...GaugeTile, ...PivotTile, TsgcWinFormsKPICard und TsgcWinFormsDashboardMapTileTsgcWpfDashboardTile, ...ChartTile, ...GridTile, ...GaugeTile, ...PivotTile, TsgcWpfKPICard. Keine Kartenkachel.TsgcAvaloniaDashboardTile, ...ChartTile, ...GridTile, ...GaugeTile, ...PivotTile, TsgcAvaloniaKPICard. Keine Kartenkachel.
sgcMapsSgcMapControl (Namespace esegece.sgcMaps.WinForms)TsgcWpfMapTsgcAvaloniaMap
sgcEditorsTsgcWinForms<Editor>TsgcWpf<Editor>TsgcAvalonia<Editor>
Editor ist ButtonEdit, CurrencyEdit, MaskEdit, SpinEdit, DatePicker, DateTimePicker, TimePicker, LookupEdit, SearchEdit, TokenEdit, Memo, ColorPicker, MonthCalendar, RadioGroup, CheckGroup, Rating oder RangeSlider.
sgcNavigationTsgcWinFormsNavigationBar, ...NavigationTabs, ...NavigationBreadcrumb, ...DockManagerTsgcWpfNavigationBar, ...NavigationTabs, ...NavigationBreadcrumb, ...DockManagerTsgcAvaloniaNavigationBar, ...NavigationTabs, ...NavigationBreadcrumb, ...DockManager
sgcToolbarTsgcWinFormsRibbon, TsgcWinFormsToolbar, TsgcWinFormsStatusBarTsgcWpfRibbon, TsgcWpfToolbar, TsgcWpfStatusBarTsgcAvaloniaRibbon, TsgcAvaloniaToolbar, TsgcAvaloniaStatusBar
sgcWizardTsgcWinFormsWizard, TsgcWinFormsStepperTsgcWpfWizard, TsgcWpfStepperTsgcAvaloniaWizard, TsgcAvaloniaStepper
sgcRichEditTsgcWinFormsRichEditTsgcWpfRichEditTsgcAvaloniaRichEdit
sgcPDF-ViewerTsgcPDFViewerControlTsgcWpfPDFViewerTsgcAvaloniaPDFViewer
sgcReports-DesignerTsgcWinFormsReportDesignerTsgcWpfReportDesignerTsgcAvaloniaReportDesigner
sgcReports-VorschauTsgcReportPreviewVCL (ein WinForms-Panel)TsgcWpfReportPreviewTsgcAvaloniaReportPreview
sgcUICoreTsgcWinFormsAIQueryBar, TsgcWinFormsValidationSummaryTsgcWpfAIQueryBar, TsgcWpfValidationSummaryTsgcAvaloniaAIQueryBar, TsgcAvaloniaValidationSummary

Der Namespace ist einer pro Produkt (esegece.sgcGrid, esegece.sgcCharts, ...) und für die drei Hosts derselbe, außer bei der WinForms-Karte, die in esegece.sgcMaps.WinForms liegt. Die Host-Steuerelemente kommen in den Paketen esegece.<Product>.WinForms, .Wpf und .Avalonia; die WinForms-Kartenkachel des Dashboards liegt in esegece.sgcDashboard.Maps.WinForms. Unter WPF und Avalonia wird jedes Produkt außer sgcReports in XAML mit einem Namespace-URI deklariert, xmlns:sgc="https://www.esegece.com/sgcui"; für sgcReports verwenden Sie eine clr-namespace-Zuordnung.

Die Mitglieder, die sich bei einer Portierung ändern

Alles andere an den Steuerelementen behält seinen Namen. Dies sind die Stellen, an denen der Host durchscheint.

Thema WinForms WPF Avalonia
Eine Liste an das Grid bindenDataSource (und DataMember)ItemsSource (DependencyProperty)ItemsSource (StyledProperty)
Bindungsmitglieder des GridsAutoGenerateColumns, KeyMember, SelectedItem, ItemsBinding und ItemsWriteBack (Registered), auf den drei Hosts gleich
Synchronisierung des aktuellen ElementskeineIsSynchronizedWithCurrentItemkeine
Grid-Spalten und DatenColumns (TsgcGridColumns), Data (TsgcGridData)
DiagrammmodellChart (TsgcChart)
Planner-ModellData (TsgcPlannerData), Options (TsgcPlannerSchedulerOptions)
ThemeTheme des Steuerelements (TsgcUITheme; utDefault folgt sgcUIApplication.Theme)dasselbe, plus sgcUICore_Theme_Avalonia.sgcUIApplyThemeToWindow
UI-ThreadControl.BeginInvokeDispatcher.BeginInvokeDispatcher.UIThread.Post
AnwendungsstartApplication.Run(form)new Application().Run(window)eine Application-Klasse mit einem Theme und StartWithClassicDesktopLifetime
Zielframework der Appnet8.0-windows (auch net472)net8.0-windows (auch net472)net8.0, net9.0, net10.0

HOST-Zeilen und SAME-Zeilen

Jeder Auszug stammt aus dem Beispiel MigrateToAvalonia, das sich in Release für die Editionen Registered und Community mit 0 Warnungen kompilieren lässt und seinen Selbsttest unter WinForms, WPF und Avalonia besteht. In den Host-Dateien unterscheidet sich eine mit HOST markierte Zeile zwischen den drei Hosts, und eine mit SAME markierte Zeile ist in allen identisch.

Einmal geschrieben: die gemeinsame Schicht

Die gemeinsame Klassenbibliothek referenziert nur die Modellpakete esegece.sgcGrid, esegece.sgcCharts, esegece.sgcPlanner und esegece.sgcUICore, nie ein Host-Paket. Die Grid-Spalten, mit Gruppierung und Zusammenfassungen, werden gegen TsgcGridColumns konfiguriert:

Shared\TMigrateModel.cs
// the grid columns, grouped by Region, with a sum of Amount in the
// footer and in every group row; TsgcGridColumns is the Columns of
// TsgcWinFormsGrid, TsgcWpfGrid and TsgcAvaloniaGrid
public static void ConfigureGrid(TsgcGridColumns aColumns)
{
    aColumns.BeginUpdate();
    try
    {
        aColumns.Clear();
        aColumns.Add(nameof(TOrder.Id), "Order", TsgcGridDataType.gdtInteger).Width = 80;
        aColumns.Add(nameof(TOrder.Customer), "Customer").Width = 180;
        aColumns.Add(nameof(TOrder.Region), "Region").GroupIndex = 0;
        TsgcGridColumn oDate = aColumns.Add(nameof(TOrder.Date), "Date", TsgcGridDataType.gdtDateTime);
        oDate.Width = 110;
        oDate.DisplayFormat = "yyyy-mm-dd";
        TsgcGridColumn oAmount = aColumns.Add(nameof(TOrder.Amount), "Amount", TsgcGridDataType.gdtFloat);
        oAmount.Width = 120;
        oAmount.DisplayFormat = "#,##0.00";
        oAmount.SummaryType = TsgcGridSummaryType.gsuSum;
        oAmount.SummaryFormat = "\"Total: \"#,##0.00";
        aColumns.Add(nameof(TOrder.Status), "Status").Width = 100;
    }
    finally
    {
        aColumns.EndUpdate();
    }
}

Das Diagramm ist ein TsgcChart-Modell, dessen Tortenserie live aus einer ObservableCollection über TsgcChartDataSource_Items gespeist wird:

Shared\TMigrateModel.cs
// the chart model: one pie series fed by RegionTotals through the
// items data source (live: a changed Amount updates its slice)
Chart = new TsgcChart();
Chart.Title.Text = "Amount by region";
Chart.Title.Visible = true;
Chart.Legend.Position = TsgcChartLegendPosition.clpTop;
Pie = new TsgcChartSeries_Pie();
Pie.Title = "Amount";
Pie.Chart = Chart;
FChartSource = new TsgcChartDataSource_Items();
FChartSource.Series = Pie;
FChartSource.LabelMember = nameof(TRegionTotal.Region);
FChartSource.YMember = nameof(TRegionTotal.Amount);
FChartSource.Items = RegionTotals;

Ein Theme für jedes sgcUI-Steuerelement der Anwendung:

Shared\TMigrateModel.cs
// the theme of every sgcUI control of the application (their Theme is
// utDefault, so they follow sgcUIApplication.Theme), and one accent
public static void ApplyTheme()
{
    sgcUIApplication.Theme = TsgcUITheme.utLight;
    sgcUIApplication.AccentColor = 0xFF2563EB;
}

Der eine Host-Dienst: an den UI-Thread senden

Gebundene Auflistungen ändern sich im UI-Thread. Die gemeinsame Schicht kennt den Host nicht, daher erhält sie den Post-Aufruf als Delegate:

Shared\TMigrateModel.cs
// aPost runs an action on the UI thread; it is the only host specific
// service of the layer (WinForms Control.BeginInvoke, WPF
// Dispatcher.BeginInvoke, Avalonia Dispatcher.UIThread.Post)
public TMigrateModel(Action<Action> aPost)
Shared\TMigrateModel.cs
// a feed on a worker thread: the order is built there and posted to the
// UI thread with aPost, because bound collections change on the UI thread
public Task AddOrderFromWorker()
{
    return Task.Run(() =>
    {
        TOrder oOrder = DoNewOrder();
        FPost(() => DoAdd(oOrder));
    });
}

Die Steuerelementfelder unterscheiden sich nur im Typ

Vorher: die WinForms- oder die WPF-Typen. Nachher: die Avalonia-Typen.

WinForms\TMigrateForm.cs
// HOST: the WinForms control types
private readonly TsgcWinFormsGrid FGrid;
private readonly TsgcWinFormsChart FChart;
private readonly TsgcWinFormsScheduler FScheduler;
Wpf\TMigrateWindow.cs
// HOST: the WPF control types
private readonly TsgcWpfGrid FGrid;
private readonly TsgcWpfChart FChart;
private readonly TsgcWpfScheduler FScheduler;
Avalonia\TMigrateWindow.cs
// HOST: the Avalonia control types
private readonly TsgcAvaloniaGrid FGrid;
private readonly TsgcAvaloniaChart FChart;
private readonly TsgcAvaloniaScheduler FScheduler;

Den Bildschirm binden: derselbe Block auf jedem Host

Zwei Zeilen sind mit HOST markiert: der Aufruf des UI-Threads und die Listenbindung. Der Rest ist in den drei Dateien derselbe Text.

WinForms\TMigrateForm.cs
// HOST: WinForms reaches the UI thread with Control.BeginInvoke
FModel = new TMigrateModel(aAction => BeginInvoke(aAction));

// SAME on every host: the shared columns, footer and group sums
TMigrateModel.ConfigureGrid(FGrid.Columns);
FGrid.ShowFooter = true;
FGrid.GroupSummaries = true;
// HOST: WinForms binds with DataSource (WPF and Avalonia: ItemsSource)
FGrid.DataSource = FModel.Orders;
// SAME on every host: the shared chart model and planner data
FChart.Chart = FModel.Chart;
TMigrateModel.ConfigureScheduler(FScheduler.Options);
FScheduler.Data = FModel.Planner;
FScheduler.View = TsgcPlannerSchedulerViewKind.psvWorkWeek;
FScheduler.Date = TMigrateModel.CS_WEEK;
Wpf\TMigrateWindow.cs
// HOST: WPF reaches the UI thread with Dispatcher.BeginInvoke
FModel = new TMigrateModel(aAction => Dispatcher.BeginInvoke(aAction));

// SAME on every host: the shared columns, footer and group sums
TMigrateModel.ConfigureGrid(FGrid.Columns);
FGrid.ShowFooter = true;
FGrid.GroupSummaries = true;
// HOST: WPF binds with ItemsSource (WinForms: DataSource)
FGrid.ItemsSource = FModel.Orders;
// SAME on every host: the shared chart model and planner data
FChart.Chart = FModel.Chart;
TMigrateModel.ConfigureScheduler(FScheduler.Options);
FScheduler.Data = FModel.Planner;
FScheduler.View = TsgcPlannerSchedulerViewKind.psvWorkWeek;
FScheduler.Date = TMigrateModel.CS_WEEK;
Avalonia\TMigrateWindow.cs
// HOST: Avalonia reaches the UI thread with Dispatcher.UIThread.Post
FModel = new TMigrateModel(aAction => Dispatcher.UIThread.Post(aAction));

// SAME on every host: the shared columns, footer and group sums
TMigrateModel.ConfigureGrid(FGrid.Columns);
FGrid.ShowFooter = true;
FGrid.GroupSummaries = true;
// HOST: Avalonia binds with ItemsSource, as WPF (WinForms: DataSource)
FGrid.ItemsSource = FModel.Orders;
// SAME on every host: the shared chart model and planner data
FChart.Chart = FModel.Chart;
TMigrateModel.ConfigureScheduler(FScheduler.Options);
FScheduler.Data = FModel.Planner;
FScheduler.View = TsgcPlannerSchedulerViewKind.psvWorkWeek;
FScheduler.Date = TMigrateModel.CS_WEEK;

Der Anwendungsstart

Der Startcode ist von Natur aus Host-Code. Der Theme-Aufruf ist auf den drei Hosts derselbe.

WinForms\Program.cs
// HOST: the WinForms application start
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// SAME on every host: one theme for every sgcUI control
TMigrateModel.ApplyTheme();
TMigrateForm oForm = new TMigrateForm(vTest ? vFolder : null);
Application.Run(oForm);
return oForm.ExitCode;
Wpf\Program.cs
// HOST: the WPF application start
Application oApp = new Application { ShutdownMode = ShutdownMode.OnMainWindowClose };
// SAME on every host: one theme for every sgcUI control
TMigrateModel.ApplyTheme();
TMigrateWindow oWindow = new TMigrateWindow(vTest ? vFolder : null);
oApp.Run(oWindow);
return oWindow.ExitCode;
Avalonia\Program.cs
// HOST: Avalonia needs an Application class with a theme
internal sealed class TMigrateApp : Application
{
    public static string TestFolder;

    public override void Initialize()
    {
        Styles.Add(new FluentTheme());
        RequestedThemeVariant = ThemeVariant.Light;
    }

    public override void OnFrameworkInitializationCompleted()
    {
        // SAME on every host: one theme for every sgcUI control
        TMigrateModel.ApplyTheme();
        IClassicDesktopStyleApplicationLifetime oDesktop =
            ApplicationLifetime as IClassicDesktopStyleApplicationLifetime;
        if (oDesktop != null)
            oDesktop.MainWindow = new TMigrateWindow(TestFolder);
        base.OnFrameworkInitializationCompleted();
    }
}

Acht Schritte pro Bildschirm

Die Windows-Anwendung funktioniert nach jedem Schritt weiter, daher lässt sich der Umstieg Bildschirm für Bildschirm durchführen.

1

Die gemeinsame Schicht auslagern

Verschieben Sie die Daten und die Steuerelementkonfiguration in eine Klassenbibliothek, die nur die sgcUI-Modellpakete referenziert (esegece.sgcGrid, esegece.sgcCharts, esegece.sgcPlanner, esegece.sgcUICore). Schreiben Sie sie gegen TsgcGridColumns, TsgcChart, TsgcPlannerData und TsgcPlannerSchedulerOptions.

2

Sie unter Windows aufrufen

Lassen Sie den bestehenden WinForms- oder WPF-Bildschirm diese Bibliothek aufrufen. Er funktioniert unter Windows weiter wie zuvor.

3

Die Avalonia-App anlegen

Ein net8.0-Projekt mit Avalonia.Desktop, Avalonia.Themes.Fluent und den benötigten Paketen esegece.<Product>.Avalonia.

4

Die Steuerelementtypen tauschen

TsgcWinForms* und TsgcWpf* werden zu TsgcAvalonia*, mit den in der Zuordnungstabelle genannten Ausnahmen.

5

Das Fenster portieren

Ein Form mit einem TableLayoutPanel oder ein WPF-Window mit einem Grid wird zu einem Avalonia-Window mit einem Grid. WPF-XAML wandert nach .axaml und behält den sgc-Namespace-URI.

6

Nur WinForms: die Bindung

Ändern Sie DataSource in ItemsSource. WPF-Code verwendet bereits ItemsSource.

7

Der Aufruf des UI-Threads

BeginInvoke oder Dispatcher.BeginInvoke wird zu Dispatcher.UIThread.Post.

8

Jeden Host prüfen

Führen Sie auf jedem Host dieselben Prüfungen aus, wie es das /selftest des Beispiels tut, und vergleichen Sie das gespeicherte Grid-Layout-JSON: Es muss derselbe Text sein.

Was sich nicht eins zu eins zuordnen lässt

Lesen Sie dies, bevor Sie den Umstieg planen.

MigrateToAvalonia

Ein Bildschirm mit einem Grid aus 40 Aufträgen, nach Region gruppiert, einem Tortendiagramm des Betrags je Region und einem Scheduler für die Arbeitswoche, von drei Hosts aus einer gemeinsamen Schicht angezeigt.

Wo sie liegt

In den sgcUI-.NET-Demos, Ordner Suite\MigrateToAvalonia der Lösung sgcUI_Demos.sln: Shared, WinForms, Wpf, Avalonia und eine readme.html. Im Demo-Download referenzieren die Projekte die sgcUI-NuGet-Pakete.

So starten Sie sie

dotnet build Avalonia\sgcUIMigrate.Avalonia.csproj -c Release, und dasselbe für WinForms\sgcUIMigrate.WinForms.csproj und Wpf\sgcUIMigrate.Wpf.csproj. Fügen Sie für die Community Edition -p:SgcCommunity=true hinzu. Der Avalonia-Host läuft auch unter macOS und Linux.

Selbsttest

sgcUIMigrate.<Host>.exe /selftest [folder] prüft die Zeilen, die Gruppierung, die Torte, den Scheduler, einen in einem Worker-Thread hinzugefügten Auftrag und einen entfernten Auftrag, schreibt migrate_selftest_<host>.txt und migrate_layout_<host>.json und beendet sich mit der Anzahl fehlgeschlagener Prüfungen. Alle 13 Prüfungen bestehen auf den drei Hosts, und die drei Layoutdateien sind Byte für Byte gleich.

Fairerweise gegenüber beiden Wegen: XPF zielt darauf, eine bestehende WPF-Anwendung mit ihrem Code und ihren Steuerelementen weitgehend unverändert unter macOS und Linux zu betreiben, und sgcUI tut das nicht. Mit sgcUI portieren Sie den Fenstercode jedes Bildschirms nach Avalonia, und die sgcUI-Teile des Bildschirms werden unverändert übernommen. Bildschirme, die auf Steuerelementen anderer Anbieter beruhen, müssen diese Steuerelemente vor dem Umstieg zuerst unter Windows ersetzen. sgcUI ist der Weg, wenn Ihre Bildschirme das sgcUI-Grid, Diagramme, den Planner, Pivot, Diagram und die weiteren oben genannten Produkte nutzen oder darauf umsteigen können und Sie native Avalonia-Steuerelemente mit vollständigem Quellcode und ohne Laufzeitschicht dazwischen wünschen. Zu Produkten und Editionen siehe die sgcUI-Produktseite.

Bestes Preis-Leistungs-Verhältnis: All-AccessAlle eSeGeCe-Produkte, inklusive Premium-Support, ab €1,059 pro Jahr.
All-Access-Preise ansehen

Stellen Sie noch heute Ihren ersten Bildschirm um

Fügen Sie die kostenlosen Community-Pakete von NuGet hinzu oder die Registered-Pakete für alle Funktionen und vollständigen Quellcode, und portieren Sie Ihren ersten Bildschirm mit dem Beispiel MigrateToAvalonia daneben.