동일한 sgcUI API로 WinForms 및 WPF에서 Avalonia로

sgcUI는 제품마다 하나의 모델을 공유하는 WinForms, WPF, Avalonia용 네이티브 컨트롤을 제공합니다. 그리드 열, 차트, 플래너 데이터, 테마를 한 번만 작성하면 모든 호스트에서 변경 없이 컴파일되므로, 화면을 Avalonia로, 그리고 macOS와 Linux로 옮길 때 바꾸는 것은 창 코드와 컨트롤 형식이며 화면 로직은 그대로입니다. 이 키트는 세 호스트 모두에서 컴파일되고 자체 테스트를 통과하는 샘플의 코드로 그 방법을 보여 줍니다.

macOS와 Linux에서도 실행해야 하는 Windows 데스크톱 앱

그리드, 차트, 스케줄러가 있는 업무용 화면, 유지하고 싶은 데이터 계층, 그리고 화면 로직을 새 UI 프레임워크로 다시 작성하고 싶지 않은 경우입니다.

WinForms에서

WinForms는 Windows에서만 실행됩니다. sgcUI에서는 현재 사용 중인 TsgcWinForms* 컨트롤에 같은 멤버를 가진 TsgcAvalonia* 대응 컨트롤이 있습니다. 구성 코드는 공유 클래스 라이브러리로 옮기고, 폼은 Avalonia 창이 되며, DataSource는 ItemsSource가 됩니다.

WPF에서

WPF도 Windows에서만 실행됩니다. WPF용 sgcUI 컨트롤은 Avalonia와 가장 비슷합니다. 둘 다 ItemsSource로 바인딩하고, 둘 다 같은 sgc 네임스페이스 URI로 XAML에서 선언하며, 주된 코드 변경은 UI 스레드 호출입니다.

기존 WPF 애플리케이션의 일반적인 경로는 Avalonia XPF이며, 벤더는 이를 "a binary-compatible WPF runtime" 및 "a fork of WPF that maintains API and binary compatibility across the managed surface area"라고 설명합니다. 이 글을 쓰는 시점(2026-10-20)에 XPF는 애플리케이션당 영구 라이선스로 판매되며 12개월의 업데이트와 지원이 포함됩니다. Internal은 앱당 EUR 9,500(자사 직원에게만 배포), Business는 앱당 EUR 29,500(macOS 및 데스크톱 Linux에 대한 상업적 배포, 임베디드 Linux는 EUR 21,250 추가), Enterprise는 모바일 또는 브라우저용으로 앱당 EUR 124,500부터입니다. 서드파티 WPF 스위트는 조건부로 XPF에서 실행할 수 있습니다. XPF 서드파티 라이브러리 안내에는 Win32 API 심이 "required for DevExpress controls"이고, 일부 DevExpress 컨트롤이 System.Drawing.Common(GDI+)에 의존하며 이는 "which is deprecated on non-Windows platforms"이고, Linux의 DevExpress 컨트롤에는 libgdiplus가 필요하며, "Issues most commonly arise with controls that use GDI or WinForms components"라고 되어 있습니다. Avalonia 자체는 무료인 MIT 라이선스 UI 프레임워크입니다. .NET용 sgcUI는 개발자 단위로 라이선스되며 .NET Standard 에디션은 €380부터, WinForms, WPF, Avalonia용 전체 C# 소스 코드, 무료 바이너리 재배포가 포함되고 애플리케이션당 요금은 없습니다. 무료 Community 패키지는 NuGet에서 받을 수 있습니다.

하나의 모델, 세 개의 얇은 호스트

각 sgcUI 제품에는 호스트를 전혀 모르는 모델이 있습니다. WinForms, WPF, Avalonia 컨트롤은 그 위의 얇은 뷰입니다.

공유 모델

TsgcGridColumns, TsgcGridData, TsgcChart, TsgcPlannerData, TsgcPlannerSchedulerOptions, TsgcPivotEngine, TsgcDiagramDocument는 세 호스트에서 같은 형식입니다. 이를 기준으로 작성한 코드는 각 호스트에서 변경 없이 컴파일됩니다.

동일한 멤버 이름

Columns, Data, ShowFooter, GroupSummaries, GroupBy, SaveLayoutToString, LoadLayoutFromString, Chart, Options, View, Date, PrintSettings, CreatePrintSource, Print, ShowPrintPreview, ExportToPDF, 그리고 OnCellClick, OnSelectionChange, OnSortChange 같은 그리드 이벤트.

동일한 저장 레이아웃

SaveLayoutToString로 저장한 그리드 레이아웃은 모든 호스트에서 같은 JSON 텍스트입니다. 샘플에서는 세 호스트가 레이아웃을 파일에 쓰고, 세 파일의 SHA-256이 같습니다. 테마(TsgcUITheme, sgcUIApplication.Theme, sgcUIApplication.AccentColor, 고대비)도 공유됩니다.

제품별 호스트 컨트롤

경험칙: TsgcWinForms 또는 TsgcWpf 접두사를 TsgcAvalonia로 바꿉니다. 예외는 표에 표시되어 있습니다.

제품 WinForms WPF Avalonia
sgcGridTsgcWinFormsGridTsgcWpfGridTsgcAvaloniaGrid
sgcGrid에서 선언하는 열코드에서 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는 Radial, Linear, Digital, Compass, Clock, LED, LEDBar, ProgressRing, VUMeter 또는 Annunciator 중 하나입니다.
sgcDashboardTsgcWinFormsDashboardTsgcWpfDashboardTsgcAvaloniaDashboard
sgcDashboard 타일TsgcWinFormsDashboardTile, ...ChartTile, ...GridTile, ...GaugeTile, ...PivotTile, TsgcWinFormsKPICard, 그리고 TsgcWinFormsDashboardMapTileTsgcWpfDashboardTile, ...ChartTile, ...GridTile, ...GaugeTile, ...PivotTile, TsgcWpfKPICard. 지도 타일 없음.TsgcAvaloniaDashboardTile, ...ChartTile, ...GridTile, ...GaugeTile, ...PivotTile, TsgcAvaloniaKPICard. 지도 타일 없음.
sgcMapsSgcMapControl(네임스페이스 esegece.sgcMaps.WinForms)TsgcWpfMapTsgcAvaloniaMap
sgcEditorsTsgcWinForms<Editor>TsgcWpf<Editor>TsgcAvalonia<Editor>
Editor는 ButtonEdit, CurrencyEdit, MaskEdit, SpinEdit, DatePicker, DateTimePicker, TimePicker, LookupEdit, SearchEdit, TokenEdit, Memo, ColorPicker, MonthCalendar, RadioGroup, CheckGroup, Rating 또는 RangeSlider 중 하나입니다.
sgcNavigationTsgcWinFormsNavigationBar, ...NavigationTabs, ...NavigationBreadcrumb, ...DockManagerTsgcWpfNavigationBar, ...NavigationTabs, ...NavigationBreadcrumb, ...DockManagerTsgcAvaloniaNavigationBar, ...NavigationTabs, ...NavigationBreadcrumb, ...DockManager
sgcToolbarTsgcWinFormsRibbon, TsgcWinFormsToolbar, TsgcWinFormsStatusBarTsgcWpfRibbon, TsgcWpfToolbar, TsgcWpfStatusBarTsgcAvaloniaRibbon, TsgcAvaloniaToolbar, TsgcAvaloniaStatusBar
sgcWizardTsgcWinFormsWizard, TsgcWinFormsStepperTsgcWpfWizard, TsgcWpfStepperTsgcAvaloniaWizard, TsgcAvaloniaStepper
sgcRichEditTsgcWinFormsRichEditTsgcWpfRichEditTsgcAvaloniaRichEdit
sgcPDF 뷰어TsgcPDFViewerControlTsgcWpfPDFViewerTsgcAvaloniaPDFViewer
sgcReports 디자이너TsgcWinFormsReportDesignerTsgcWpfReportDesignerTsgcAvaloniaReportDesigner
sgcReports 미리 보기TsgcReportPreviewVCL(WinForms Panel)TsgcWpfReportPreviewTsgcAvaloniaReportPreview
sgcUICoreTsgcWinFormsAIQueryBar, TsgcWinFormsValidationSummaryTsgcWpfAIQueryBar, TsgcWpfValidationSummaryTsgcAvaloniaAIQueryBar, TsgcAvaloniaValidationSummary

네임스페이스는 제품마다 하나(esegece.sgcGrid, esegece.sgcCharts 등)이며 세 호스트에서 동일합니다. 단, WinForms 지도는 esegece.sgcMaps.WinForms에 있습니다. 호스트 컨트롤은 esegece.<Product>.WinForms, .Wpf, .Avalonia 패키지에 들어 있으며, 대시보드의 WinForms 지도 타일은 esegece.sgcDashboard.Maps.WinForms에 있습니다. WPF와 Avalonia에서는 sgcReports를 제외한 모든 제품을 하나의 네임스페이스 URI xmlns:sgc="https://www.esegece.com/sgcui"로 XAML에 선언하며, sgcReports에는 clr-namespace 매핑을 사용합니다.

포팅에서 바뀌는 멤버

컨트롤의 나머지 모든 것은 이름이 그대로입니다. 아래는 호스트의 차이가 드러나는 부분입니다.

항목 WinForms WPF Avalonia
목록을 그리드에 바인딩DataSource(및 DataMember)ItemsSource(DependencyProperty)ItemsSource(StyledProperty)
그리드 바인딩 멤버AutoGenerateColumns, KeyMember, SelectedItem, ItemsBinding, ItemsWriteBack(Registered). 세 호스트에서 동일합니다
현재 항목 동기화없음IsSynchronizedWithCurrentItem없음
그리드 열과 데이터Columns (TsgcGridColumns), Data (TsgcGridData)
차트 모델Chart (TsgcChart)
플래너 모델Data (TsgcPlannerData), Options (TsgcPlannerSchedulerOptions)
테마컨트롤의 Theme(TsgcUITheme. utDefault는 sgcUIApplication.Theme를 따릅니다)동일하며, 추가로 sgcUICore_Theme_Avalonia.sgcUIApplyThemeToWindow
UI 스레드Control.BeginInvokeDispatcher.BeginInvokeDispatcher.UIThread.Post
애플리케이션 시작Application.Run(form)new Application().Run(window)테마가 있는 Application 클래스와 StartWithClassicDesktopLifetime
앱의 대상 프레임워크net8.0-windows(net472도 가능)net8.0-windows(net472도 가능)net8.0, net9.0, net10.0

HOST 줄과 SAME 줄

모든 발췌 코드는 Registered 및 Community 에디션에서 Release로 경고 0개로 컴파일되고 WinForms, WPF, Avalonia에서 자체 테스트를 통과하는 MigrateToAvalonia 샘플에서 복사한 것입니다. 호스트 파일에서 HOST로 표시된 줄은 세 호스트마다 다르고, SAME로 표시된 줄은 모두 동일합니다.

한 번만 작성: 공유 계층

공유 클래스 라이브러리는 모델 패키지 esegece.sgcGrid, esegece.sgcCharts, esegece.sgcPlanner, esegece.sgcUICore만 참조하며 호스트 패키지는 절대 참조하지 않습니다. 그룹화와 요약을 포함한 그리드 열은 TsgcGridColumns를 기준으로 구성합니다.

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();
    }
}

차트는 TsgcChart 모델이며, 파이 시리즈는 TsgcChartDataSource_Items를 통해 ObservableCollection에서 실시간으로 데이터를 받습니다.

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;

애플리케이션의 모든 sgcUI 컨트롤에 적용되는 하나의 테마:

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;
}

유일한 호스트 서비스: UI 스레드로 게시

바인딩된 컬렉션은 UI 스레드에서 변경됩니다. 공유 계층은 호스트를 모르므로 게시 호출을 델리게이트로 받습니다.

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));
    });
}

컨트롤 필드는 형식만 다릅니다

변경 전: WinForms 또는 WPF 형식. 변경 후: Avalonia 형식.

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;

화면 바인딩: 모든 호스트에서 동일한 블록

두 줄에 HOST 표시가 있습니다. UI 스레드 호출과 목록 바인딩입니다. 나머지는 세 파일에서 같은 텍스트입니다.

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;

애플리케이션 시작

시작 코드는 본질적으로 호스트 코드입니다. 테마 호출은 세 호스트에서 동일합니다.

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();
    }
}

화면당 여덟 단계

Windows 앱은 각 단계 후에도 계속 동작하므로 한 번에 화면 하나씩 옮길 수 있습니다.

1

공유 계층 분리

데이터와 컨트롤 구성을 sgcUI 모델 패키지(esegece.sgcGrid, esegece.sgcCharts, esegece.sgcPlanner, esegece.sgcUICore)만 참조하는 클래스 라이브러리로 옮깁니다. TsgcGridColumns, TsgcChart, TsgcPlannerData, TsgcPlannerSchedulerOptions를 기준으로 작성합니다.

2

Windows에서 호출

기존 WinForms 또는 WPF 화면이 해당 라이브러리를 호출하도록 합니다. Windows에서는 이전처럼 계속 동작합니다.

3

Avalonia 앱 만들기

net8.0 프로젝트에 Avalonia.Desktop, Avalonia.Themes.Fluent, 그리고 필요한 esegece.<Product>.Avalonia 패키지를 추가합니다.

4

컨트롤 형식 교체

TsgcWinForms*와 TsgcWpf*는 TsgcAvalonia*가 됩니다. 매핑 표에 나온 예외가 있습니다.

5

창 포팅

TableLayoutPanel이 있는 Form 또는 Grid가 있는 WPF Window는 Grid가 있는 Avalonia Window가 됩니다. WPF XAML은 .axaml로 옮기고 sgc 네임스페이스 URI를 유지합니다.

6

WinForms 전용: 바인딩

DataSource를 ItemsSource로 바꿉니다. WPF 코드는 이미 ItemsSource를 사용합니다.

7

UI 스레드 호출

BeginInvoke 또는 Dispatcher.BeginInvoke는 Dispatcher.UIThread.Post가 됩니다.

8

모든 호스트 확인

샘플의 /selftest처럼 각 호스트에서 같은 검사를 실행하고, 저장된 그리드 레이아웃 JSON을 비교합니다. 같은 텍스트여야 합니다.

일대일로 대응되지 않는 부분

이동을 계획하기 전에 먼저 읽어 보세요.

MigrateToAvalonia

지역별로 그룹화된 40건의 주문 그리드, 지역별 금액 파이 차트, 평일 스케줄러가 있는 화면 하나를 하나의 공유 계층에서 세 호스트가 표시합니다.

위치

sgcUI .NET 데모의 sgcUI_Demos.sln 솔루션 Suite\MigrateToAvalonia 폴더에 Shared, WinForms, Wpf, Avalonia, readme.html가 있습니다. 데모 다운로드에서는 프로젝트가 sgcUI NuGet 패키지를 참조합니다.

실행 방법

dotnet build Avalonia\sgcUIMigrate.Avalonia.csproj -c Release, 그리고 WinForms\sgcUIMigrate.WinForms.csproj와 Wpf\sgcUIMigrate.Wpf.csproj도 같습니다. Community 에디션에는 -p:SgcCommunity=true를 추가하세요. Avalonia 호스트는 macOS와 Linux에서도 실행됩니다.

자체 테스트

sgcUIMigrate.<Host>.exe /selftest [folder]는 행, 그룹화, 파이, 스케줄러, 작업자 스레드에서 추가된 주문과 제거된 주문을 확인하고 migrate_selftest_<host>.txt 및 migrate_layout_<host>.json를 작성한 다음, 실패한 검사 수를 종료 코드로 반환합니다. 세 호스트 모두에서 13개 검사를 통과하며, 세 레이아웃 파일은 바이트 단위로 동일합니다.

두 경로를 공정하게 말씀드리면, XPF는 기존 WPF 애플리케이션을 코드와 컨트롤을 대체로 그대로 둔 채 macOS와 Linux에서 실행하는 것을 목표로 하며, sgcUI는 그렇게 하지 않습니다. sgcUI에서는 각 화면의 창 코드를 Avalonia로 포팅하고, 화면의 sgcUI 부분은 그대로 이어집니다. 다른 벤더의 컨트롤로 만든 화면은 이동하기 전에 Windows에서 먼저 그 컨트롤을 교체해야 합니다. 화면이 sgcUI 그리드, 차트, 플래너, 피벗, 다이어그램과 위에 나온 다른 제품을 사용하거나 그쪽으로 옮길 수 있고, 전체 소스 코드가 있고 중간에 런타임 계층이 없는 네이티브 Avalonia 컨트롤을 원한다면 sgcUI가 알맞은 선택입니다. 제품과 에디션은 sgcUI 제품 페이지를 참조하세요.

최고의 가성비: All-Access모든 eSeGeCe 제품과 프리미엄 지원이 포함되어 연 €1,059부터 이용할 수 있어요.
All-Access 가격 보기

오늘 첫 화면을 옮겨 보세요

NuGet에서 무료 Community 패키지를 추가하거나, 모든 기능과 전체 소스 코드가 포함된 Registered 패키지를 추가한 다음, 옆에 MigrateToAvalonia 샘플을 두고 첫 화면을 포팅하세요.