From 5384de7b236db9aea8867431e3933ea00e00332a Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Sun, 28 Sep 2025 16:29:02 +0800 Subject: [PATCH 1/4] feat: update TrayIcon in macOS. --- demo/Semi.Avalonia.Demo/App.axaml | 6 +++++- demo/Semi.Avalonia.Demo/Assets/irihi2.ico | Bin 0 -> 948 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 demo/Semi.Avalonia.Demo/Assets/irihi2.ico diff --git a/demo/Semi.Avalonia.Demo/App.axaml b/demo/Semi.Avalonia.Demo/App.axaml index 472efd6..c22351e 100644 --- a/demo/Semi.Avalonia.Demo/App.axaml +++ b/demo/Semi.Avalonia.Demo/App.axaml @@ -1,4 +1,5 @@ - + diff --git a/demo/Semi.Avalonia.Demo/Assets/irihi2.ico b/demo/Semi.Avalonia.Demo/Assets/irihi2.ico new file mode 100644 index 0000000000000000000000000000000000000000..193bdcbbb90ccad7c0140e6d4c64c1f73de3d85a GIT binary patch literal 948 zcmZQzU<5)CU}R8Wn8(b(AO>W22Kc%2a!GLknY^AJE~)y?c=Nhye$KW3ktN-Qv^_H)gW+C}$tl-@KbY<5w&{!yQ2e4q@7$+28NQ@om^$ z{EIQo@BR6;zkY9KbeO?FD|F+{ynpj#EK-;o3>ayJHdMZU`;=j~^>X=yXJ7u^S+(C@ znxTc0W~lZ$b3u0b^D4G?Hy9LrXolYGmRpcl{`}LQnKwWEeVxM~phh$FEtdbl+Pia4 xe@;(3{e6ELP2=jO?O$8#f)i{EiA*#@^*U|3A8Y2HvH|8h22WQ%mvv4FO#pSN(GUOt literal 0 HcmV?d00001 From 9dd846f6be68bfb801c02ccfde57a041d021cb3d Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Sun, 28 Sep 2025 18:02:09 +0800 Subject: [PATCH 2/4] feat: add JumpTo functionality in ApplicationViewModel and integrate with menu. --- demo/Semi.Avalonia.Demo/App.axaml | 16 +++++++++++++++- .../ViewModels/ApplicationViewModel.cs | 7 +++++++ demo/Semi.Avalonia.Demo/Views/MainView.axaml.cs | 16 +++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/demo/Semi.Avalonia.Demo/App.axaml b/demo/Semi.Avalonia.Demo/App.axaml index c22351e..605631b 100644 --- a/demo/Semi.Avalonia.Demo/App.axaml +++ b/demo/Semi.Avalonia.Demo/App.axaml @@ -20,6 +20,14 @@ + + + + + - + + diff --git a/demo/Semi.Avalonia.Demo/ViewModels/ApplicationViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/ApplicationViewModel.cs index b91a492..0655629 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/ApplicationViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/ApplicationViewModel.cs @@ -2,11 +2,18 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; namespace Semi.Avalonia.Demo.ViewModels; public partial class ApplicationViewModel : ObservableObject { + [RelayCommand] + private void JumpTo(string header) + { + WeakReferenceMessenger.Default.Send(header, "JumpTo"); + } + [RelayCommand] private void Exit() { diff --git a/demo/Semi.Avalonia.Demo/Views/MainView.axaml.cs b/demo/Semi.Avalonia.Demo/Views/MainView.axaml.cs index 1d0a78d..fbc876b 100644 --- a/demo/Semi.Avalonia.Demo/Views/MainView.axaml.cs +++ b/demo/Semi.Avalonia.Demo/Views/MainView.axaml.cs @@ -9,6 +9,7 @@ using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Styling; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; namespace Semi.Avalonia.Demo.Views; @@ -18,6 +19,19 @@ public partial class MainView : UserControl { InitializeComponent(); this.DataContext = new MainViewModel(); + WeakReferenceMessenger.Default.Register(this, "JumpTo", MessageHandler); + } + + private void MessageHandler(object _, string message) + { + foreach (var item in tab.ItemsView) + { + if (item is TabItem tabItem && tabItem.Header is not null && tabItem.Header.Equals(message)) + { + tab.SelectedItem = tabItem; + break; + } + } } } @@ -233,4 +247,4 @@ public class MenuItemViewModel public ICommand? Command { get; set; } public object? CommandParameter { get; set; } public IList? Items { get; set; } -} +} \ No newline at end of file From f9a85734d1a630f066a38d1366dba11731337bf5 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Mon, 29 Sep 2025 01:33:18 +0800 Subject: [PATCH 3/4] feat: add Activate command to ApplicationViewModel and bind to TrayIcon. --- demo/Semi.Avalonia.Demo/App.axaml | 1 + .../ViewModels/ApplicationViewModel.cs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/demo/Semi.Avalonia.Demo/App.axaml b/demo/Semi.Avalonia.Demo/App.axaml index 605631b..99f40c7 100644 --- a/demo/Semi.Avalonia.Demo/App.axaml +++ b/demo/Semi.Avalonia.Demo/App.axaml @@ -33,6 +33,7 @@ diff --git a/demo/Semi.Avalonia.Demo/ViewModels/ApplicationViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/ApplicationViewModel.cs index 0655629..7a07dfc 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/ApplicationViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/ApplicationViewModel.cs @@ -1,4 +1,5 @@ using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; @@ -8,9 +9,26 @@ namespace Semi.Avalonia.Demo.ViewModels; public partial class ApplicationViewModel : ObservableObject { + [RelayCommand] + private void Activate() + { + if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop) return; + var mainWindow = desktop.MainWindow; + if (mainWindow is not null && !mainWindow.IsActive) + { + if (mainWindow.WindowState is WindowState.Minimized) + { + mainWindow.WindowState = WindowState.Normal; + } + + mainWindow.Activate(); + } + } + [RelayCommand] private void JumpTo(string header) { + Activate(); WeakReferenceMessenger.Default.Send(header, "JumpTo"); } From f7ce4aef308d3a211954ced2858f4c10af6c1514 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Mon, 29 Sep 2025 01:33:53 +0800 Subject: [PATCH 4/4] feat: update application icons for Android and Desktop projects. --- demo/Semi.Avalonia.Demo.Android/Icon.png | Bin 7266 -> 717 bytes .../Semi.Avalonia.Demo.Android.csproj | 4 +--- .../Semi.Avalonia.Demo.Desktop.csproj | 1 + .../Semi.Avalonia.Demo.Drm.csproj | 1 + 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/Semi.Avalonia.Demo.Android/Icon.png b/demo/Semi.Avalonia.Demo.Android/Icon.png index b5694aa2509cbfd737cf4811d98e3f486235ece6..fcc884735504e4f86731f00a4c5955a872d5b096 100644 GIT binary patch literal 717 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yaTa()7BevL9R^{>lpinR(g8$%zH2dih1^v)|cBF)%PidAc};RLpsM_hP4$p@2i6 zvROiF^lZ^Q&W((F74+96-nV3JaoBO@`UJ!0dl=To?yqIMG1EbTgQbaP#G%};jgS9r z{_^kav1eWC!9{yg3c#GiQqWspoatycQH-7B z9wDIf0Jxcio>K9BMSQ>qkrz|(j^O7Mpq1+3gH%FILaKmKtDY-mq~Fo73;;5G>IE%3 zk_n{+923X|lR}t+q~!v9XIhZ?@2Kk;mV4#M<91c$a`ppCu~QHg)E)>RS;WGzG~}b& zow=#w3f^|xlGJwA619?NYr4N%|t zs^soC?xgAH)V3S&MBpx^(mp8x12RUDOIL#f&Ea6Hp8`wQG)RUxCK;35m&xa;lXbt8 zZH=?++`TjH-8r!-ljcm}7h$&%zhURaNB4rKg^EZv;R)6uIpv3&u@`^i^UJaYC<%o~ z>U&XJU&$&6*Aa;?4r#mBO z&_KDENh|Ti>%dYY9pQ&gzWC#Z?&I+iZA{8I5)-(=59CLU4Tm41oHxuv^Z<0Q?|XIZ zh1~^b#V#Mm^xbow!Y~4mZqQw4y@i&YO#|&EgA6$p({~g9KOQp)N(}W=N>P7*Q2v8H zxXWIBV|`&prY=OmCkta-f%2^rbH-z5wyI0G(u*H>P8WtBFr1?8{LUx@=W$hm35oTp z5@!snoWMfNV#!%rjHFtVD;y03M z`8Pb5BVW|P8Z-Fteiw%uC4`s+^P{TKOkTNIRp8)0##w_<-}L@vi`;W85qHF}aVX7j zeLXMi4vE&4zPBiyoG)5?koAg!ScpQEE?ZSdj}jWtf0GWSLsiV-^J0WO7p4Za3fcd` za(8r!pRD&m)(sdL9efO`rG4j0DK6=nJ1`D$#n97JJKvD9Z+Pm^*^zGi zz1iXhJDvT-V|JI8Um^k@&2JWtC#QM|^E2JmIH2M?vhWxr$ zDVNcd7_+rOEDT0RD1FHL=ENG^^C5IBrn6L1ZiB;!eyDiE=mV%G;TcO@Tu%6?G?W*1 zGr&0q-83o|THmRU5w$7|bH%8`-<)#gT&mR>bfgP0Zk8Q|5TJyGJ<64l@c{=DwGUYE zg)*M#d?nK2{h#-ABMa{OVN$0^8DANEJ;X0aULDznGg^yam8J`QILq|uukMCgP zQD|phbi2u!?72XLt@yoFxNKReh`Y~%qkD?VNgT#jQ&J%%KzBb8*L5tEd%UW@~M% zvz&=&G_xB1Qc6+#wP4|f%SQ{pB#eOvt7Ic^`@+@b@y)X1^RORi7<2%2`zGcy7W(<@ zm|b#knjEnsQKVJ;<6>{_E9I%z^U={w~Rppc@XI$!(= zKpd>Li+0UZ23d`p&+nn{s= zjpb(jP$D?`F=0bbdO55leA$!)9Q0#5&-pTTPlwN-=6dAKEYf@pD=gDV3(~H(;YS?Mjz{tRI=)0C_LO# zge(Jc;G!6lRB<~{I)O!r1~`q!N%3r!E|umG`#9dO8b}$U=&|O+TbL1&!D0in)zJ#p zZ>U5PxBo|tlUHY4gvRi7i(yr(1PRl!bu0#xZRP)@TbZOm!?&8 zpx1$W3ba!ApJ)W^h#AJB415|kCMP+XTDvOvpR11(oR8D-XU)fNWU5MN zHIJh($<6^Gt!APQUMVxn+Y@HLei~!)7o_?np#8K&3>$GBU>Kfs^ zxTSje1JQ(vSjnAb(%{XrA`I-(j~bJi3R^145eU%x3tAKiht5VSi@-FToW^_u9JimH z_JemtC%_xVh9KTIuFA8lO2Fxpm3kezpPs�oHF~s4UuCr=BYw;LcaS=Xz7jK?*yw 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 INfY@00M=r&GXMYp diff --git a/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj b/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj index 1c08a69..ec5bdb0 100644 --- a/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj +++ b/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj @@ -14,9 +14,7 @@ - - Resources\drawable\Icon.png - + diff --git a/demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj b/demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj index a579f53..ef6119b 100644 --- a/demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj +++ b/demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj @@ -4,6 +4,7 @@ net8.0 enable true + ..\Semi.Avalonia.Demo\Assets\irihi.ico diff --git a/demo/Semi.Avalonia.Demo.Drm/Semi.Avalonia.Demo.Drm.csproj b/demo/Semi.Avalonia.Demo.Drm/Semi.Avalonia.Demo.Drm.csproj index 7006d63..bac5f20 100644 --- a/demo/Semi.Avalonia.Demo.Drm/Semi.Avalonia.Demo.Drm.csproj +++ b/demo/Semi.Avalonia.Demo.Drm/Semi.Avalonia.Demo.Drm.csproj @@ -4,6 +4,7 @@ net8.0 enable true + ..\Semi.Avalonia.Demo\Assets\irihi.ico