diff --git a/Ink Canvas/Helpers/DeviceIdentifier.cs b/Ink Canvas/Helpers/DeviceIdentifier.cs index da8d7de3..306ff21f 100644 --- a/Ink Canvas/Helpers/DeviceIdentifier.cs +++ b/Ink Canvas/Helpers/DeviceIdentifier.cs @@ -349,14 +349,7 @@ namespace Ink_Canvas.Helpers [JsonProperty("averageSessionSeconds")] public double AverageSessionSeconds { get; set; } - // 保留旧字段以保持向后兼容性(已弃用) - [JsonProperty("totalUsageMinutes")] - [Obsolete("已弃用,请使用 TotalUsageSeconds")] - public long TotalUsageMinutes { get; set; } - [JsonProperty("averageSessionMinutes")] - [Obsolete("已弃用,请使用 AverageSessionSeconds")] - public double AverageSessionMinutes { get; set; } [JsonProperty("lastUpdateCheck")] public DateTime LastUpdateCheck { get; set; } @@ -386,53 +379,6 @@ namespace Ink_Canvas.Helpers [JsonProperty("lastWeekUsageSeconds")] public long LastWeekUsageSeconds { get; set; } - // 保留旧字段以保持向后兼容性(已弃用) - [JsonProperty("weeklyUsageMinutes")] - [Obsolete("已弃用,请使用 WeeklyUsageSeconds")] - public long WeeklyUsageMinutes { get; set; } - - [JsonProperty("lastWeekUsageMinutes")] - [Obsolete("已弃用,请使用 LastWeekUsageSeconds")] - public long LastWeekUsageMinutes { get; set; } - - /// - /// 数据迁移:从分钟精度迁移到秒级精度 - /// - public void MigrateToSecondsPrecision() - { - try - { - // 如果新字段为空但旧字段有数据,进行迁移 - if (TotalUsageSeconds == 0 && TotalUsageSeconds > 0) - { - TotalUsageSeconds = TotalUsageSeconds * 60; - LogHelper.WriteLogToFile($"DeviceIdentifier | 迁移总使用时长: {TotalUsageSeconds}分钟 -> {TotalUsageSeconds}秒"); - } - - if (AverageSessionSeconds == 0 && AverageSessionSeconds > 0) - { - AverageSessionSeconds = AverageSessionSeconds * 60; - LogHelper.WriteLogToFile($"DeviceIdentifier | 迁移平均会话时长: {AverageSessionSeconds}分钟 -> {AverageSessionSeconds}秒"); - } - - if (WeeklyUsageSeconds == 0 && WeeklyUsageSeconds > 0) - { - WeeklyUsageSeconds = WeeklyUsageSeconds * 60; - LogHelper.WriteLogToFile($"DeviceIdentifier | 迁移每周使用时长: {WeeklyUsageSeconds}分钟 -> {WeeklyUsageSeconds}秒"); - } - - if (LastWeekUsageSeconds == 0 && LastWeekUsageSeconds > 0) - { - LastWeekUsageSeconds = LastWeekUsageSeconds * 60; - LogHelper.WriteLogToFile($"DeviceIdentifier | 迁移上周使用时长: {LastWeekUsageSeconds}分钟 -> {LastWeekUsageSeconds}秒"); - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"DeviceIdentifier | 数据迁移失败: {ex.Message}", LogHelper.LogType.Error); - } - } - /// /// 检查并重置每周统计数据(秒级精度) /// @@ -448,13 +394,9 @@ namespace Ink_Canvas.Helpers LastWeekLaunchCount = WeeklyLaunchCount; LastWeekUsageSeconds = WeeklyUsageSeconds; - // 同时更新旧字段以保持兼容性 - LastWeekUsageSeconds = LastWeekUsageSeconds / 60; - // 重置本周数据 WeeklyLaunchCount = 0; WeeklyUsageSeconds = 0; - WeeklyUsageSeconds = 0; WeekStartDate = currentWeekStart; LogHelper.WriteLogToFile($"DeviceIdentifier | 每周统计重置 - 上周启动: {LastWeekLaunchCount}次, 上周使用: {FormatDuration(LastWeekUsageSeconds)}"); @@ -487,8 +429,6 @@ namespace Ink_Canvas.Helpers { CheckAndResetWeeklyStats(); WeeklyUsageSeconds += seconds; - // 同时更新旧字段以保持兼容性 - WeeklyUsageSeconds = WeeklyUsageSeconds / 60; } } @@ -586,9 +526,6 @@ namespace Ink_Canvas.Helpers { var stats = LoadUsageStats(); - // 执行数据迁移(如果需要) - stats.MigrateToSecondsPrecision(); - // 计算本次会话时长(秒级精度) long sessionSeconds = 0; if (stats.LastLaunchTime != DateTime.MinValue) @@ -599,8 +536,7 @@ namespace Ink_Canvas.Helpers // 更新秒级精度数据 stats.TotalUsageSeconds += sessionSeconds; - // 同时更新旧字段以保持兼容性 - stats.TotalUsageSeconds = stats.TotalUsageSeconds / 60; + // 记录每周使用时长(秒级精度) stats.RecordWeeklyUsage(sessionSeconds); @@ -609,8 +545,7 @@ namespace Ink_Canvas.Helpers if (stats.LaunchCount > 0) { stats.AverageSessionSeconds = (double)stats.TotalUsageSeconds / stats.LaunchCount; - // 同时更新旧字段以保持兼容性 - stats.AverageSessionSeconds = stats.AverageSessionSeconds / 60; + } } @@ -648,21 +583,13 @@ namespace Ink_Canvas.Helpers var currentWeekLaunches = stats.WeeklyLaunchCount; var currentWeekSeconds = stats.WeeklyUsageSeconds; - // 如果秒级数据为空但分钟数据存在,进行转换 - if (currentWeekSeconds == 0 && stats.WeeklyUsageSeconds > 0) - { - currentWeekSeconds = stats.WeeklyUsageSeconds * 60; - } + // 如果本周数据不足,参考上周数据 var weeklyLaunches = currentWeekLaunches > 0 ? currentWeekLaunches : stats.LastWeekLaunchCount; var weeklySeconds = currentWeekSeconds > 0 ? currentWeekSeconds : stats.LastWeekUsageSeconds; - // 如果秒级数据仍为空,使用分钟数据转换 - if (weeklySeconds == 0 && stats.LastWeekUsageSeconds > 0) - { - weeklySeconds = stats.LastWeekUsageSeconds * 60; - } + // 综合评分系统(0-100分) var frequencyScore = CalculateFrequencyScoreWithWeeklyData(stats, daysSinceLastUse, weeklyLaunches, weeklySeconds); @@ -730,7 +657,7 @@ namespace Ink_Canvas.Helpers else if (weeklySeconds >= 3600) score += 5; // 1-2小时:轻度使用 // 历史使用深度评分(10分)- 反映用户的长期使用习惯(秒级精度) - var totalSeconds = stats.TotalUsageSeconds > 0 ? stats.TotalUsageSeconds : stats.TotalUsageSeconds * 60; + var totalSeconds = stats.TotalUsageSeconds; if (totalSeconds >= 180000) score += 10; // 50小时以上:资深用户 else if (totalSeconds >= 72000) score += 7; // 20-50小时:中等用户 else if (totalSeconds >= 18000) score += 4; // 5-20小时:新手用户 @@ -791,25 +718,7 @@ namespace Ink_Canvas.Helpers } } - /// - /// 获取使用统计信息(兼容性方法 - 分钟精度) - /// - [Obsolete("请使用 GetUsageStats() 获取秒级精度数据")] - public static (int launchCount, long totalMinutes, double avgSessionMinutes, UpdatePriority priority) GetUsageStatsInMinutes() - { - try - { - var stats = LoadUsageStats(); - var totalMinutes = stats.TotalUsageSeconds / 60; - var avgMinutes = stats.AverageSessionSeconds / 60; - return (stats.LaunchCount, totalMinutes, avgMinutes, stats.UpdatePriority); - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"DeviceIdentifier | 获取使用统计失败: {ex.Message}", LogHelper.LogType.Error); - return (0, 0, 0, UpdatePriority.Medium); - } - } + /// /// 加载使用统计 @@ -822,26 +731,27 @@ namespace Ink_Canvas.Helpers var stats = LoadUsageStatsFromFile(UsageStatsFilePath); if (stats != null) { - // 执行数据迁移(如果需要) - stats.MigrateToSecondsPrecision(); return stats; } - // 2. 尝试从备份文件加载 + // 2. 主文件无法读取,尝试从备份文件恢复 + LogHelper.WriteLogToFile("DeviceIdentifier | 主文件无法读取,尝试从备份文件恢复"); + if (RestoreUsageStatsFromBackup()) + { + // 恢复成功后重新尝试加载主文件 + stats = LoadUsageStatsFromFile(UsageStatsFilePath); + if (stats != null) + { + LogHelper.WriteLogToFile("DeviceIdentifier | 从备份文件成功恢复主文件"); + return stats; + } + } + + // 3. 如果备份恢复也失败,尝试直接加载备份文件 stats = LoadUsageStatsFromFile(UsageStatsBackupPath); if (stats != null) { - LogHelper.WriteLogToFile("DeviceIdentifier | 从备份文件恢复使用统计"); - stats.MigrateToSecondsPrecision(); - // 尝试恢复主文件 - try - { - SaveUsageStatsToFile(UsageStatsFilePath, stats); - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"DeviceIdentifier | 恢复主文件失败: {ex.Message}", LogHelper.LogType.Warning); - } + LogHelper.WriteLogToFile("DeviceIdentifier | 直接使用备份文件数据"); return stats; } @@ -853,8 +763,8 @@ namespace Ink_Canvas.Helpers DeviceId = DeviceId, LastLaunchTime = DateTime.Now, LaunchCount = 0, - TotalUsageSeconds = 0, // 保持兼容性 - AverageSessionSeconds = 0, // 保持兼容性 + TotalUsageSeconds = 0, + AverageSessionSeconds = 0, LastUpdateCheck = DateTime.MinValue, UpdatePriority = UpdatePriority.Medium, UsageFrequency = UsageFrequency.Medium @@ -913,21 +823,7 @@ namespace Ink_Canvas.Helpers return stats; } - // 如果解密失败,尝试作为普通JSON文件读取(向后兼容) - try - { - string json = File.ReadAllText(filePath); - var plainStats = JsonConvert.DeserializeObject(json); - if (plainStats != null && !string.IsNullOrEmpty(plainStats.DeviceId)) - { - LogHelper.WriteLogToFile($"DeviceIdentifier | 从普通JSON文件加载使用统计: {filePath}"); - return plainStats; - } - } - catch - { - // 忽略JSON解析错误 - } + } } catch (Exception ex) @@ -997,7 +893,7 @@ namespace Ink_Canvas.Helpers return null; } - /// + /// /// 保存使用统计到文件(加密) /// private static void SaveUsageStatsToFile(string filePath, UsageStats stats) @@ -1062,45 +958,7 @@ namespace Ink_Canvas.Helpers LogHelper.WriteLogToFile($"DeviceIdentifier | 记录更新检查失败: {ex.Message}", LogHelper.LogType.Error); } } - - /// - /// 验证使用统计数据的完整性 - /// - public static bool ValidateUsageStatsIntegrity() - { - try - { - // 检查主文件 - if (File.Exists(UsageStatsFilePath)) - { - var mainStats = LoadUsageStatsFromFile(UsageStatsFilePath); - if (mainStats != null && mainStats.DeviceId == DeviceId) - { - LogHelper.WriteLogToFile("DeviceIdentifier | 主文件数据完整性验证通过"); - return true; - } - } - - // 检查备份文件 - if (File.Exists(UsageStatsBackupPath)) - { - var backupStats = LoadUsageStatsFromFile(UsageStatsBackupPath); - if (backupStats != null && backupStats.DeviceId == DeviceId) - { - LogHelper.WriteLogToFile("DeviceIdentifier | 备份文件数据完整性验证通过"); - return true; - } - } - - LogHelper.WriteLogToFile("DeviceIdentifier | 数据完整性验证失败", LogHelper.LogType.Warning); - return false; - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"DeviceIdentifier | 数据完整性验证失败: {ex.Message}", LogHelper.LogType.Error); - return false; - } - } + /// /// 从备份文件恢复使用统计数据 @@ -1429,26 +1287,6 @@ namespace Ink_Canvas.Helpers } } - /// - /// 检查是否应该进行版本修复(不受分级策略影响) - /// - /// 当前版本 - /// 可用版本 - /// 是否需要版本修复 - public static bool ShouldPerformVersionFix(string currentVersion, string availableVersion) - { - try - { - // 版本修复功能不受使用频率分级策略影响,始终允许 - LogHelper.WriteLogToFile($"DeviceIdentifier | 版本修复检查 - 当前版本: {currentVersion}, 可用版本: {availableVersion}, 结果: 允许"); - return true; - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"DeviceIdentifier | 版本修复检查失败: {ex.Message}", LogHelper.LogType.Error); - return true; // 出错时默认允许 - } - } /// diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index 5e9794d2..af57d460 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -996,14 +996,15 @@ namespace Ink_Canvas // 使用辅助方法设置光标 SetCursorBasedOnEditingMode(sender as InkCanvas); - // 在选择模式下,如果点击的不是UI元素,则取消选择 - if (inkCanvas.EditingMode == InkCanvasEditingMode.Select) + // 检查是否点击了空白区域或其他非图片元素 + var hitTest = e.OriginalSource; + if (!(hitTest is Image) && !(hitTest is MediaElement)) { - var hitTest = e.OriginalSource; - // 如果点击的不是图片或其他UI元素,则取消选择 - if (!(hitTest is Image) && !(hitTest is MediaElement)) + // 如果当前有选中的元素,取消选中状态 + if (currentSelectedElement != null) { - + UnselectElement(currentSelectedElement); + currentSelectedElement = null; } } } diff --git a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs index 0a0b6b6e..0986d973 100644 --- a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs @@ -108,8 +108,6 @@ namespace Ink_Canvas { if (sender is FrameworkElement element) { - - // 取消之前选中的元素 if (currentSelectedElement != null && currentSelectedElement != element) {