From 311b3e76f01438a87da5c36f5c60d06fdc388d81 Mon Sep 17 00:00:00 2001 From: MaddoScientisto Date: Thu, 26 Feb 2026 18:43:07 +0100 Subject: [PATCH 01/16] Add Avalonia UI frontend alongside WinForms and WPF Introduce Avalonia as a new cross-platform UI option, including new XAML and code-behind files for the application and main window. Update Program.cs to support a --avalonia launch argument and add corresponding launch profile. Integrate Avalonia NuGet packages and ensure DataModel supports UI-thread invocation for all frontends. All business logic and state are shared via DI, enabling consistent behavior across WinForms, WPF, and Avalonia. --- imagecatalog/AvaloniaApp.axaml | 8 + imagecatalog/AvaloniaApp.axaml.cs | 20 ++ imagecatalog/AvaloniaMainWindow.axaml | 317 ++++++++++++++++++++ imagecatalog/AvaloniaMainWindow.axaml.cs | 151 ++++++++++ imagecatalog/DataModel.cs | 12 +- imagecatalog/ImageCatalog 2.csproj | 4 + imagecatalog/Program.cs | 23 +- imagecatalog/Properties/launchSettings.json | 9 +- 8 files changed, 535 insertions(+), 9 deletions(-) create mode 100644 imagecatalog/AvaloniaApp.axaml create mode 100644 imagecatalog/AvaloniaApp.axaml.cs create mode 100644 imagecatalog/AvaloniaMainWindow.axaml create mode 100644 imagecatalog/AvaloniaMainWindow.axaml.cs diff --git a/imagecatalog/AvaloniaApp.axaml b/imagecatalog/AvaloniaApp.axaml new file mode 100644 index 0000000..8ce9be1 --- /dev/null +++ b/imagecatalog/AvaloniaApp.axaml @@ -0,0 +1,8 @@ + + + + + + diff --git a/imagecatalog/AvaloniaApp.axaml.cs b/imagecatalog/AvaloniaApp.axaml.cs new file mode 100644 index 0000000..9a14f4d --- /dev/null +++ b/imagecatalog/AvaloniaApp.axaml.cs @@ -0,0 +1,20 @@ +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; +using Microsoft.Extensions.DependencyInjection; + +namespace ImageCatalog_2; + +public partial class AvaloniaApp : Avalonia.Application +{ + public override void Initialize() => AvaloniaXamlLoader.Load(this); + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + var model = Program.ServiceProvider.GetRequiredService(); + desktop.MainWindow = new AvaloniaMainWindow(model); + } + base.OnFrameworkInitializationCompleted(); + } +} diff --git a/imagecatalog/AvaloniaMainWindow.axaml b/imagecatalog/AvaloniaMainWindow.axaml new file mode 100644 index 0000000..a16b949 --- /dev/null +++ b/imagecatalog/AvaloniaMainWindow.axaml @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WPFCatalog/Controls/GeneralSettingsControl.xaml.cs b/WPFCatalog/Controls/GeneralSettingsControl.xaml.cs deleted file mode 100644 index af3e0aa..0000000 --- a/WPFCatalog/Controls/GeneralSettingsControl.xaml.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace WPFCatalog.Controls -{ - /// - /// Interaction logic for GeneralSettingsControl.xaml - /// - public partial class GeneralSettingsControl : UserControl - { - public GeneralSettingsControl() - { - InitializeComponent(); - } - } -} diff --git a/WPFCatalog/Controls/TextSettingsControl.xaml b/WPFCatalog/Controls/TextSettingsControl.xaml deleted file mode 100644 index 7d7ac19..0000000 --- a/WPFCatalog/Controls/TextSettingsControl.xaml +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WPFCatalog/Controls/TextSettingsControl.xaml.cs b/WPFCatalog/Controls/TextSettingsControl.xaml.cs deleted file mode 100644 index 2c29c51..0000000 --- a/WPFCatalog/Controls/TextSettingsControl.xaml.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace WPFCatalog.Controls -{ - /// - /// Interaction logic for TextSettingsControl.xaml - /// - public partial class TextSettingsControl : UserControl - { - public TextSettingsControl() - { - InitializeComponent(); - } - } -} diff --git a/WPFCatalog/Converters/FontFamilyStringConverter.cs b/WPFCatalog/Converters/FontFamilyStringConverter.cs deleted file mode 100644 index 66a103e..0000000 --- a/WPFCatalog/Converters/FontFamilyStringConverter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; -using System.Windows.Media; - -namespace WPFCatalog -{ - public class FontFamilyStringConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - FontFamily fontfamily = new FontFamily("Verdana"); - if (value != null) - { - fontfamily = new FontFamily(value.ToString()); - } - return fontfamily; - - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/WPFCatalog/Converters/MaddoColorConverter.cs b/WPFCatalog/Converters/MaddoColorConverter.cs deleted file mode 100644 index 2248484..0000000 --- a/WPFCatalog/Converters/MaddoColorConverter.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Data; -using System.Windows.Media; - -namespace WPFCatalog -{ - public class MaddoColorConverter : IValueConverter - { - private static readonly DependencyObject _dummy = new DependencyObject(); - - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - Color color = Colors.Black; - - if (value != null && value != DependencyProperty.UnsetValue && value is string && !String.IsNullOrWhiteSpace((string)value)) - { - string c = (string)value; - object convertedColor = null; - try - { - convertedColor = ColorConverter.ConvertFromString(c); - } - catch (Exception ex) - { - if (!DesignerProperties.GetIsInDesignMode(_dummy)) - { - throw new FormatException($"String {c} does not represent a valid color", ex); - } - } - if (convertedColor != null) - { - color = (Color)convertedColor; - } - } - - return color; - - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value != null) - { - Color color = (Color)value; - Debug.WriteLine(color.ToString()); - return color.ToString(); - } - return string.Empty; - } - } -} diff --git a/WPFCatalog/Icons/camera-photo-5.png b/WPFCatalog/Icons/camera-photo-5.png deleted file mode 100644 index 1e54dea89239f7aecab3e55382432a57c6c60e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEj_j@0&dJZ`)n?tl_D>YcrteH1n%v&r z_6D}Ly{R)T`VJp%U+u(U_=)Yn=RMi8mff8cWF)~OFv~$-WW{y$A1{yZestu=+3oSG z&-%`<+PkhrV8*hQ4ewnRUknIe7pLYMye{r1*HV%4X?dHU{>ck| zs(0@WS#7Fw`q{JI+3dR#C0qjge}50puz&x+!tD24v(58kk8ISvq@u{d^zUx|=RKci zEV-XtS~}Hxx}E&G32B;t>-d*GSbscw&PTgr*5=;!Ih!|bJNz+$VW-kr)vZyzZ`bDD zdOKmUiX>CfOy#944wp^VJktDE_l13#;i38c*D_eE=SXQ^&Zs#wS>6BV2j%{}<;_*M zMMau++<$!Y9pArWY%f0w28tA3$P_MhR$G2Mg#cHe}xXv-#y^E~XyA zxp~`9A3DSo931>4sOiiJqfXd0L&cpl=vk}N&X|36 zR#siFuT9OI5uz=6u{*hMGRsntvuTqJcr5E5+63w^3R~NB>hgxW7av*Fso9+0z3la` zwK}Jb8WcDl6>k>z+SPEbj{Eec6(L$J4;h2fmSlDXd2uNQExq!+>AH!r@n_8fu^&N~ zx18ouV|nwmav#qfwrkg~UoZFjqtCGHz5VvaE%BhFZ(8CSQR1ARo12WKm#mw4Gnb-4MGept&A*)L>|!Yha{nWDsIx zY-MC-Wn>7^Q1iRK5Jf|7eoAIqB~$~@2Ez~o3oBDIE0BJW4IybSR|7Q|ft=)%nVgze zoXU_|`z^)3Ja diff --git a/WPFCatalog/Icons/document-open-6.png b/WPFCatalog/Icons/document-open-6.png deleted file mode 100644 index fe03b7f429925fe2a0d967ce4ac873644a773707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1028 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(^vlDyqr zfHV;NblzPLq&N#aB8!2v2N=7Z%(epwmK8Xr18J~%3^B*n9%f)*{Nw537-DgH>cq3& zA%POd>Yv|RtZZy%X4!2LzBcQ+Q_L2PNgf5lYk%F?dio#p;@o=2gCZ^g21;8z7K(`p zvNXClg^7qXb=KafSyi0Ar}(^kcX7L*{+Ex3BIkVm^yl2?J?l4I`?TDu^3jh=KYq-t zxsbK;?)#gyH}9qU&-dZ>J3s&EvCf0Y2MTI=7~45>E}r*JU;y5#YWRk z_2+L6r8w!UX%u{UwNQR)S@u@PU2#nMYAtMh{SHewRS!J6zNB=wLFbGIzpBn$%L5w{$|YkN(F5kei=+)V)ST;=l!vT@w@nB zzjaS+`1qQx+~o*lab`adrLB74*fin)dnU5n+4I)Wh#^k8r651bc^`X=>Qjc>>pmu_ z{yW%Ubm7{Bciw`gSu&F6R3BIwNs247g+%L3HxkHX*AVHxv$I_M!v=>9D_@-V@|rEU zI^Hfs#bKo&Gt>6un}Q%+xA%j6NPGtYeY$MQEFmIs%{F9U@$T;u+%j))HO5>F*LI>u&^>Q)HN`- zGB8kC_wWHs14yM6L>Ewlp@FV}k*<+Jh>@|Ck(rgDDMSOCbxb3QhTQy=%(P0V2A~aw zAqJLKh89-F77z_#T2`z;4W=L``D7-i<`t(hWR#Q?Sn2D7?aC}mP0r8F&Ce^=%P&gT z&w(f@*7tD_@X}xJ3eHBg8TSeyWzAeg&vO5@cg=ep*R+Vo@rCV@iHfs)A>3 zVtQ&&YGO)d;mK4Rpdwy~qSB(|R0hA&vizLHHU6d_ff6PNiTKbUADENN%ggmLlk@X* ovorJ3^?(l7FDS~-N=+^)*3ScL*Dtf(0?OwMp00i_>zopr0HQU2XaE2J diff --git a/WPFCatalog/Icons/document-open-folder.png b/WPFCatalog/Icons/document-open-folder.png deleted file mode 100644 index 98b8a9448a5756451eadce70af3772be1f543993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE0z%d<2gY`4S99w&sfq~J`)5S5w;`Gv>-CoX)0=DVp@A8@$w+gyk zW?Ac-n7w$Ze1a7Bf29fX7vwoQ4Hb2pPwpZlyzw76$+xg?=UZ@v)2#b0dFKL^yir1f2 zt+>ggS-@fCtq(Ex_jLpt?sq=QxidndJz~ivPG#4%|6CrooJiGKz_z#ckGRXBLZ=S# z=AO+0v)?T_Dip_agq^3>;pDE8aM_iI*m+c6pSkz-@$0O_tezzH&kKY#UzwjTyf!m7 z^Zxy?Tjg_SuDX&L3oGvKvI+89`ut4Jd~asWlEpt6A96=DZ(*2U2MkHo64!{5 z9nO2Eg!<&1*zW_C)gPi1(nVgzeoXU_vn(|^KQ}i&uUId?C|y4XqNG?qsZzH%QQuh4KwlxhNP!p~KJEcN`bK(&`qBM1 z$uKuUoQD(&2FALEmLY})R;ET)ra(`b0X=n7{@W&?21$?`gY(l$$`gxH8OqDc^)mCa zi<1)zQbA6e{mw=Ts7M&1sI(|KmBGKFGCeg(}6TtKSRv1wTBrPn7KV&978Nlr%v|Gh)I=bo&Wo;wf)BANB+lH zZr#}B5o^+8+L$5Qy-U#1iIvysU@Yf~)wiYwvButzat`B-xU*uVM@H@%-G43tQj^)d z7W)J%-S|_s$awOSnP*app4WY^yZ>4#WJzUsdZC3(#rekt*L!OnXBXX-b1CiYoW&@! z^pk@4nj8M}>*lWf|9h_WqhkUeiv*-U2=%r{^UL%vm#cAGSz+wqA#x@_^IuMWobA%y zILpfu9`x4Uees{Et*s!sx!#%UvxHbreyWK`4UUy z4@my*x%;tgS{ekt}^R9TRuU@Dh;*ZcQBo}}6huiwqJZY#kX63?F2!>&{5{m#E5RSSj=Ipl6nrGf)3-(>lN8FHB}<1h0ujo;_dm*Gnu}Ye(ta zkZJnSg%bCw9`F60dV6=>s_CaP^TKbP^!*yBtDC6A+wi*bPVoH`>$Yw0Jk3!0lKDEv*`k$L8nUW>zoz5M?3q8`t~_h) z{E0#A@wXX!e>yMkxP0-`jgKxn44XdIAAMnYgv}yPYWq8edwt?NO82f0nfkhB9#JiEjVMVjN=+$?Z| z=o{%7=;vgyt$bP0l+XkK^*s1x diff --git a/WPFCatalog/Icons/format-justify-left-2.png b/WPFCatalog/Icons/format-justify-left-2.png deleted file mode 100644 index d6abc0585efd6d5e4a41f17f3545b877c432432c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3517 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 diff --git a/WPFCatalog/Icons/picture.png b/WPFCatalog/Icons/picture.png deleted file mode 100644 index b773744c72df584d44d74ae66da69639b820ba19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1075 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(^vlDyqr zfHV;NblzPLq&N#aB8!2v2N=7Z%(epwmK8Xr18J~%3^B*n9%f)*{OIZ87-DgH>15mN z5J!==`NrSx?fsr6UZyC0*lm#t<3Xj4l|BC$xw)lRFWE5R3!`*>%YH|n^o3JfBP9Mi zI&9!*=~(cryC%nM_M1C%Et3T|r<{RzJq$VV6zLro8-Y zCtH?zQcHO8?I)hX;#2k>p0hqXwCzxCQd{M}6sGk`dj+}JkGV)R9?CHaysxHPyF4@6 z;(f>EDJMU&-M@DFidSg}y9qKGt3ES;>8*6da~>Bb-5cZ`QB9g2E4{?W4!o3=8v zPVwI461N?Orv9qg4?=(ET)ckp)jOs*(eDj*nwS9 z;lSaUNAEeC)E+3To}TlV`|EG+Gp?TVjn9|#Fg_95|7%a%`Rp6NuBg_@2pD=V0XnSQ z?S113`4EfU;*;iTcPMk(I%rNa&!2uhom+m{|8&d8972b)8Fs$1`p?Fee`_*x?ty*4 zl%QJT8c~v5l$uzQs+$5N7>o=IEOiYHbq&ozjEt-dEvyX9bq&m|3=EwgR%j8iFPNj{m$sd>ez z3>hUQ1y=g{V7oHQQj_y@bMy0x_413-^>ZLfiuIE!^^Nrm^cC`p6o^!Aq-Uz%-DZ;t za~{NH@BlE=H89pSGzu{?v@$ibGBkns$Nu+~=RggTAm;_=r9C%$#fm&t#wnnyONM1C<#gl*NYz`M`Wz sUS6)3mY54cdO$zx=OiZSXM!~97X!`EKXinb7pR@V)78&qol`;+06No>>Hq)$ diff --git a/WPFCatalog/MainWindow.xaml b/WPFCatalog/MainWindow.xaml deleted file mode 100644 index c7cd8fe..0000000 --- a/WPFCatalog/MainWindow.xaml +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -