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