using CommunityToolkit.Mvvm.ComponentModel; using HaloPixelToolBox.Client.Interface.Services; using HaloPixelToolBox.Client.Profiles.CrossVersionProfiles; using HaloPixelToolBox.Client.Utilities.Helpers; using Microsoft.UI.Xaml.Media; using Microsoft.UI.Xaml.Navigation; using XFEExtension.NetCore.WinUIHelper.Interface.Services; using XFEExtension.NetCore.WinUIHelper.Utilities; namespace HaloPixelToolBox.Client.ViewModels; public partial class AppShellPageViewModel : ViewModelBase { [ObservableProperty] public partial int SelectedIndex { get; set; } [ObservableProperty] public partial bool NeverAskAgainWhenClose { get; set; } [ObservableProperty] public partial bool CanGoBack { get; set; } [ObservableProperty] public partial string UpgradeContentText { get; set; } = string.Empty; [ObservableProperty] public partial string UserName { get; set; } = Environment.UserName; [ObservableProperty] public partial ImageSource UserTile { get; set; } = Win32Helper.GetUserTile(); public IDialogService DialogService { get; } = ServiceManager.GetService(); public INavigationViewService NavigationViewService { get; } = ServiceManager.GetService(); public Interface.Services.IPageService PageService { get; } = ServiceManager.GetService(); public IMessageService MessageService { get; } = ServiceManager.GetService(); public ILoadingService LoadingService { get; } = ServiceManager.GetService(); public IUpgradeService UpgradeService { get; } = ServiceManager.GetService(); public ICloseWindowService? CloseWindowService { get; } = ServiceManager.GetGlobalService(); public AppShellPageViewModel() { NavigationViewService.NavigationService.Navigated += NavigationService_Navigated; PageService.CurrentPageLoaded += CurrentPage_Loaded; CloseWindowService?.Closed += CloseWindowService_Closed; UpgradeService.Initialize(async () => { try { MessageService.ShowMessage("正在检查更新...", "检查更新", InfoBarSeverity.Informational); Console.WriteLine("正在检查更新..."); var upgradeInfo = await UpgradeHelper.GetReleaseNotes(); if (upgradeInfo == null) { MessageService.ShowMessage("检查更新失败,请稍后重试", "检查更新", InfoBarSeverity.Error); Console.WriteLine("[ERROR]获取更新信息失败"); return; } if (upgradeInfo.IsLatest) { MessageService.ShowMessage("当前已是最新版本", "检查更新", InfoBarSeverity.Success); Console.WriteLine("当前已是最新版本"); } else { if (upgradeInfo.LatestVersion == SystemProfile.IgnoreVersion) { MessageService.ShowMessage("当前版本已被忽略", "检查更新", InfoBarSeverity.Informational); Console.WriteLine("当前版本已被忽略"); } else { MessageService.ShowMessage("检测到新版本", "检查更新", InfoBarSeverity.Informational); Console.WriteLine("检测到新版本"); Console.WriteLine($"[DEBUG]最新版本: {upgradeInfo.LatestVersion}"); Console.WriteLine($"[DEBUG]当前版本: {UpgradeHelper.Version}"); Console.WriteLine($"[DEBUG]更新信息:{upgradeInfo.ReleaseNotes}"); UpgradeContentText = upgradeInfo.ReleaseNotes; switch (await DialogService.ShowDialog("upgradeDialog")) { case ContentDialogResult.None: Console.WriteLine("用户取消了更新"); break; case ContentDialogResult.Primary: Console.WriteLine("用户选择开始更新..."); UpgradeHelper.StartUpdate(upgradeInfo.DownloadUrl); break; case ContentDialogResult.Secondary: Console.WriteLine("用户选择忽略当前版本"); SystemProfile.IgnoreVersion = upgradeInfo.LatestVersion; break; default: break; } } } } catch (Exception ex) { Console.WriteLine($"[ERROR]检查更新时发生错误:{ex}"); } }); } private async void CloseWindowService_Closed(object sender, WindowEventArgs args) { args.Handled = true; NeverAskAgainWhenClose = SystemProfile.NeverAskAgainWhenClose; SelectedIndex = SystemProfile.MinimizeWhenClose ? 0 : 1; if (!NeverAskAgainWhenClose) { if (await DialogService.ShowDialog("closeDialog") == ContentDialogResult.Primary) { SystemProfile.NeverAskAgainWhenClose = NeverAskAgainWhenClose; SystemProfile.MinimizeWhenClose = SelectedIndex == 0; } else { return; } } if (SystemProfile.MinimizeWhenClose) { Win32Helper.ShowWindow(WindowHelper.GetHwndForCurrentWindow(), Win32Helper.SW_HIDE); } else { Environment.Exit(0); } } private async void CurrentPage_Loaded(object sender, RoutedEventArgs e) { await UpgradeService.CheckUpgrade(); } private void NavigationService_Navigated(object? sender, NavigationEventArgs e) => CanGoBack = NavigationViewService.NavigationService.CanGoBack; }