From a7e6e96ea89c73ac6027c4cbdf34c54c256162d4 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Thu, 1 Oct 2026 19:07:52 +0200 Subject: [PATCH] WPF vs WinForms vs WinUI vs Avalonia vs MAUI: add the DesktopUiFrameworks sample on net10.0 One temperature converter ViewModel (Converter.Core, net10.0) behind a WinForms form (classic event handlers and a bound form with a button command), a WPF window and an Avalonia 12.1.3 window, plus ViewModel tests and a headless Avalonia window test (xUnit v3, Avalonia.Headless). WinForms and WPF set EnableWindowsTargeting so the solution builds on Linux. --- .../Converter.Avalonia/App.axaml | 8 ++ .../Converter.Avalonia/App.axaml.cs | 20 +++++ .../Converter.Avalonia.csproj | 21 +++++ .../Converter.Avalonia/MainWindow.axaml | 15 ++++ .../Converter.Avalonia/MainWindow.axaml.cs | 8 ++ .../Converter.Avalonia/Program.cs | 15 ++++ .../Converter.Core/Converter.Core.csproj | 9 ++ .../Converter.Core/ConverterViewModel.cs | 48 ++++++++++ .../Converter.Core/RelayCommand.cs | 14 +++ .../Converter.Tests/AvaloniaWindowTests.cs | 44 +++++++++ .../Converter.Tests/Converter.Tests.csproj | 27 ++++++ .../ConverterViewModelTests.cs | 46 ++++++++++ .../Converter.WinForms/BoundForm.cs | 27 ++++++ .../Converter.WinForms/ClassicForm.cs | 28 ++++++ .../Converter.WinForms.csproj | 16 ++++ .../Converter.WinForms/Program.cs | 19 ++++ .../Converter.Wpf/App.xaml | 6 ++ .../Converter.Wpf/App.xaml.cs | 7 ++ .../Converter.Wpf/Converter.Wpf.csproj | 16 ++++ .../Converter.Wpf/MainWindow.xaml | 14 +++ .../Converter.Wpf/MainWindow.xaml.cs | 8 ++ .../DesktopUiFrameworks.sln | 90 +++++++++++++++++++ .../DesktopUiFrameworks/README.md | 35 ++++++++ 23 files changed, 541 insertions(+) create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/App.axaml create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/App.axaml.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/Converter.Avalonia.csproj create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/MainWindow.axaml create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/MainWindow.axaml.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/Program.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Core/Converter.Core.csproj create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Core/ConverterViewModel.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Core/RelayCommand.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Tests/AvaloniaWindowTests.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Tests/Converter.Tests.csproj create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Tests/ConverterViewModelTests.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.WinForms/BoundForm.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.WinForms/ClassicForm.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.WinForms/Converter.WinForms.csproj create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.WinForms/Program.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Wpf/App.xaml create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Wpf/App.xaml.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Wpf/Converter.Wpf.csproj create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Wpf/MainWindow.xaml create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/Converter.Wpf/MainWindow.xaml.cs create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/DesktopUiFrameworks.sln create mode 100644 dotnet-platform-specific/DesktopUiFrameworks/README.md diff --git a/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/App.axaml b/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/App.axaml new file mode 100644 index 000000000..43940d2d9 --- /dev/null +++ b/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/App.axaml @@ -0,0 +1,8 @@ + + + + + diff --git a/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/App.axaml.cs b/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/App.axaml.cs new file mode 100644 index 000000000..234e444ed --- /dev/null +++ b/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/App.axaml.cs @@ -0,0 +1,20 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; + +namespace Converter.Avalonia; + +public partial class App : Application +{ + public override void Initialize() => AvaloniaXamlLoader.Load(this); + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + desktop.MainWindow = new MainWindow(); + } + + base.OnFrameworkInitializationCompleted(); + } +} diff --git a/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/Converter.Avalonia.csproj b/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/Converter.Avalonia.csproj new file mode 100644 index 000000000..4b19d7a52 --- /dev/null +++ b/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/Converter.Avalonia.csproj @@ -0,0 +1,21 @@ + + + + WinExe + net10.0 + enable + enable + + + + + + + + + + + + + + diff --git a/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/MainWindow.axaml b/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/MainWindow.axaml new file mode 100644 index 000000000..36f1bd155 --- /dev/null +++ b/dotnet-platform-specific/DesktopUiFrameworks/Converter.Avalonia/MainWindow.axaml @@ -0,0 +1,15 @@ + + + + + + +