From f9ceeaad44923822ab106d3fd9218661a338ff94 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Tue, 22 Jul 2025 17:36:02 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 12 ++-- Ink Canvas/MainWindow.xaml.cs | 12 ++++ Ink Canvas/Properties/AssemblyInfo.cs | 4 +- .../Windows/HistoryRollbackWindow.xaml.cs | 68 ++++++++++++++++--- 4 files changed, 80 insertions(+), 16 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index a3e7a1be..a53dc345 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -645,8 +645,10 @@ Width="120" HorizontalAlignment="Left" Click="FixVersionButton_Click"/> - - + + + TextWrapping="Wrap" Foreground="#fafafa" /> + Foreground="#fafafa" /> @@ -668,7 +670,7 @@ + Foreground="#fafafa" /> diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index d25d39fc..58268965 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -1329,5 +1329,17 @@ namespace Ink_Canvas { // 直接调用PPT放映结束按钮的逻辑 BtnPPTSlideShowEnd_Click(BtnPPTSlideShowEnd, null); } + + private void HistoryRollbackButton_Click(object sender, RoutedEventArgs e) + { + // 收起设置面板(与插件面板一致) + BorderSettings.Visibility = Visibility.Hidden; + BorderSettingsMask.Visibility = Visibility.Hidden; + var win = new HistoryRollbackWindow(Settings.Startup.UpdateChannel); + win.ShowDialog(); + // 可选:回滚窗口关闭后恢复设置面板显示 + BorderSettings.Visibility = Visibility.Visible; + BorderSettingsMask.Visibility = Visibility.Visible; + } } } \ No newline at end of file diff --git a/Ink Canvas/Properties/AssemblyInfo.cs b/Ink Canvas/Properties/AssemblyInfo.cs index da30cbb4..40b1b4f8 100644 --- a/Ink Canvas/Properties/AssemblyInfo.cs +++ b/Ink Canvas/Properties/AssemblyInfo.cs @@ -49,5 +49,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.1.10")] -[assembly: AssemblyFileVersion("1.7.1.10")] +[assembly: AssemblyVersion("1.7.1.9")] +[assembly: AssemblyFileVersion("1.7.1.9")] diff --git a/Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs b/Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs index 224595dc..68bccee6 100644 --- a/Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs +++ b/Ink Canvas/Windows/HistoryRollbackWindow.xaml.cs @@ -5,6 +5,10 @@ using System.IO; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; +using System.Linq; // Added for OrderByDescending +using System.ComponentModel; +using System.Threading; namespace Ink_Canvas { @@ -19,83 +23,115 @@ namespace Ink_Canvas private List versionList = new List(); private VersionItem selectedItem = null; + private UpdateChannel channel = UpdateChannel.Release; + private CancellationTokenSource downloadCts = null; - public HistoryRollbackWindow() + public HistoryRollbackWindow(UpdateChannel channel = UpdateChannel.Release) { InitializeComponent(); + this.channel = channel; LoadVersions(); } private async void LoadVersions() { + LogHelper.WriteLogToFile($"HistoryRollback | 开始加载历史版本,通道: {channel}"); RollbackButton.IsEnabled = false; VersionComboBox.Items.Clear(); DownloadProgressPanel.Visibility = Visibility.Collapsed; DownloadProgressBar.Value = 0; DownloadProgressText.Text = ""; ReleaseNotesViewer.Markdown = "正在获取历史版本..."; - var releases = await AutoUpdateHelper.GetAllGithubReleases(); + var releases = await AutoUpdateHelper.GetAllGithubReleases(channel); versionList.Clear(); foreach (var (version, url, notes) in releases) { versionList.Add(new VersionItem { Version = version, DownloadUrl = url, ReleaseNotes = notes }); } + // 按版本号数字降序排列 + versionList = versionList.OrderByDescending(v => ParseVersionForSort(v.Version)).ToList(); VersionComboBox.ItemsSource = versionList; if (versionList.Count > 0) { VersionComboBox.SelectedIndex = 0; RollbackButton.IsEnabled = true; + LogHelper.WriteLogToFile($"HistoryRollback | 加载到 {versionList.Count} 个历史版本"); } else { ReleaseNotesViewer.Markdown = "未获取到历史版本信息。"; + LogHelper.WriteLogToFile($"HistoryRollback | 未获取到历史版本信息", LogHelper.LogType.Warning); } } + // 辅助方法:解析版本号用于排序 + private Version ParseVersionForSort(string version) + { + var v = version.TrimStart('v', 'V'); + Version result; + if (Version.TryParse(v, out result)) + return result; + return new Version(0, 0, 0, 0); + } + private void VersionComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { selectedItem = VersionComboBox.SelectedItem as VersionItem; if (selectedItem != null) { ReleaseNotesViewer.Markdown = selectedItem.ReleaseNotes ?? "无更新日志"; + LogHelper.WriteLogToFile($"HistoryRollback | 用户选择版本: {selectedItem.Version}"); } + // 取消聚焦,防止父级自动滚动 + Keyboard.ClearFocus(); } private async void RollbackButton_Click(object sender, RoutedEventArgs e) { if (selectedItem == null) return; + LogHelper.WriteLogToFile($"HistoryRollback | 用户点击回滚,目标版本: {selectedItem.Version}"); RollbackButton.IsEnabled = false; VersionComboBox.IsEnabled = false; DownloadProgressPanel.Visibility = Visibility.Visible; DownloadProgressBar.Value = 0; DownloadProgressText.Text = "正在准备下载..."; bool downloadSuccess = false; + downloadCts = new CancellationTokenSource(); try { - downloadSuccess = await DownloadAndInstallVersion(selectedItem.Version, selectedItem.DownloadUrl); + downloadSuccess = await DownloadAndInstallVersion(selectedItem.Version, selectedItem.DownloadUrl, downloadCts.Token); + } + catch (OperationCanceledException) + { + DownloadProgressText.Text = "下载已取消。"; + LogHelper.WriteLogToFile($"HistoryRollback | 用户取消下载", LogHelper.LogType.Info); } catch (Exception ex) { DownloadProgressText.Text = $"下载失败: {ex.Message}"; + LogHelper.WriteLogToFile($"HistoryRollback | 下载异常: {ex.Message}", LogHelper.LogType.Error); } if (downloadSuccess) { DownloadProgressBar.Value = 100; DownloadProgressText.Text = "下载完成,准备安装..."; await Task.Delay(800); + LogHelper.WriteLogToFile($"HistoryRollback | 版本 {selectedItem.Version} 下载并准备安装成功"); this.DialogResult = true; this.Close(); } - else + else if (!downloadCts.IsCancellationRequested) { DownloadProgressText.Text = "下载失败,请检查网络后重试。"; + LogHelper.WriteLogToFile($"HistoryRollback | 版本 {selectedItem?.Version} 下载失败", LogHelper.LogType.Error); RollbackButton.IsEnabled = true; VersionComboBox.IsEnabled = true; } } - private async Task DownloadAndInstallVersion(string version, string downloadUrl) + private async Task DownloadAndInstallVersion(string version, string downloadUrl, CancellationToken token) { + LogHelper.WriteLogToFile($"HistoryRollback | 开始下载版本: {version}, url: {downloadUrl}"); string updatesFolderPath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "AutoUpdate"); if (!Directory.Exists(updatesFolderPath)) Directory.CreateDirectory(updatesFolderPath); @@ -112,7 +148,7 @@ namespace Ink_Canvas client.DefaultRequestHeaders.Add("User-Agent", "ICC-CE Auto Updater"); if (existingLength > 0) client.DefaultRequestHeaders.Range = new System.Net.Http.Headers.RangeHeaderValue(existingLength, null); - using (var response = await client.GetAsync(downloadUrl, System.Net.Http.HttpCompletionOption.ResponseHeadersRead)) + using (var response = await client.GetAsync(downloadUrl, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, token)) { response.EnsureSuccessStatusCode(); var totalBytes = response.Content.Headers.ContentLength.HasValue @@ -125,9 +161,10 @@ namespace Ink_Canvas long totalRead = existingLength; int read; var lastUpdate = DateTime.Now; - while ((read = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0) + while ((read = await stream.ReadAsync(buffer, 0, buffer.Length, token)) > 0) { - await fs.WriteAsync(buffer, 0, read); + token.ThrowIfCancellationRequested(); + await fs.WriteAsync(buffer, 0, read, token); totalRead += read; if ((DateTime.Now - lastUpdate).TotalMilliseconds > 200) { @@ -141,13 +178,14 @@ namespace Ink_Canvas } DownloadProgressBar.Value = 100; DownloadProgressText.Text = "下载完成,正在校验..."; - await fs.FlushAsync(); + await fs.FlushAsync(token); } if (File.Exists(zipFilePath)) File.Delete(zipFilePath); File.Move(tmpFilePath, zipFilePath); } } // 下载完成后,调用现有安装流程 + LogHelper.WriteLogToFile($"HistoryRollback | 开始安装版本: {version}"); AutoUpdateHelper.InstallNewVersionApp(version, false); App.IsAppExitByUser = true; Application.Current.Dispatcher.Invoke(() => { @@ -155,11 +193,23 @@ namespace Ink_Canvas }); return true; } + catch (OperationCanceledException) + { + LogHelper.WriteLogToFile($"HistoryRollback | 用户取消下载", LogHelper.LogType.Info); + return false; + } catch (Exception ex) { if (File.Exists(tmpFilePath)) { /* 不删除,便于断点续传 */ } + LogHelper.WriteLogToFile($"HistoryRollback | 下载或安装异常: {ex.Message}", LogHelper.LogType.Error); return false; } } + + protected override void OnClosing(CancelEventArgs e) + { + downloadCts?.Cancel(); + base.OnClosing(e); + } } } \ No newline at end of file