using Npgsql.Replication.PgOutput.Messages; using System.Windows; using System.Windows.Input; using YY.Admin.Core.FluentValidation; using YY.Admin.Services.Service.AutoUpdate; using YY.Admin.ViewModels; using Window = HandyControl.Controls.Window; namespace YY.Admin.Views { /// /// LoginWindow.xaml 的交互逻辑 /// public partial class LoginWindow : Window { private readonly IAutoUpdateService _autoUpdateService; public LoginWindow(IAutoUpdateService autoUpdateService) { InitializeComponent(); _autoUpdateService = autoUpdateService; // 窗口加载完成后检查更新 Loaded += async (s, e) => await CheckForUpdatesAsync(); // 当 DataContext 设置后附加验证 DataContextChanged += OnDataContextChanged; } private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { // 附加验证到 UI 控件 FluentValidationHelper.Attach(LoginForm, typeof(LoginWindowViewModel)); } } private async Task CheckForUpdatesAsync() { try { // 延迟一点时间,确保UI已经加载完成 await Task.Delay(1000); var hasUpdate = await _autoUpdateService.CheckForUpdatesAsync(); if (hasUpdate) { await ShowUpdateDialogAsync(); } } catch (Exception ex) { // 更新检查失败不影响登录 System.Diagnostics.Debug.WriteLine($"更新检查异常: {ex.Message}"); } } private async Task ShowUpdateDialogAsync() { await Dispatcher.InvokeAsync(async () => { // 检查窗口是否仍然打开 if (!IsLoaded || !IsVisible || Visibility == Visibility.Collapsed) { return; } var versionInfo =await _autoUpdateService.GetVersionInfo(); if (versionInfo == null) return; var currentVersion = _autoUpdateService.GetCurrentVersion(); var updateWindow = new UpdateWindow { CurrentVersion = currentVersion, LatestVersion = versionInfo.LatestVersion, PublishDate = versionInfo.PublishDate, Changelog = versionInfo.Changelog, DownloadUrl = versionInfo.DownloadUrl, ApplicationName = versionInfo.ApplicationName, IsMandatory = versionInfo.Mandatory, Owner = this }; updateWindow.UpdateRequested += (downloadUrl) => { try { _autoUpdateService.StartUpdate(downloadUrl); Application.Current.Shutdown(); } catch (Exception ex) { MessageBox.Show($"更新启动失败: {ex.Message}", "更新错误", MessageBoxButton.OK, MessageBoxImage.Error); } }; updateWindow.ShowDialog(); }); } private void LoginWindow_Closed(object? sender, EventArgs e) { Application.Current.Shutdown(); } private void Window_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { Submit_Click(sender, e); } } private void Submit_Click(object sender, RoutedEventArgs e) { var vm = (LoginWindowViewModel)DataContext; vm.LoginMessage = string.Empty; bool valid = FluentValidationHelper.ValidateAll(LoginForm, vm.LoginInput!, vm.LoginInputValidator); if (valid) { if (vm.LoginCommand.CanExecute()) { vm.LoginCommand.Execute(); } } // 阻止事件继续冒泡 e.Handled = true; } } }