@@ -1 +1 @@
|
||||
1.7.8.0
|
||||
1.7.9.0
|
||||
|
||||
+11
-11
@@ -1,8 +1,3 @@
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Microsoft.Win32;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
@@ -18,6 +13,11 @@ using System.Windows;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Threading;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Microsoft.Win32;
|
||||
using Newtonsoft.Json;
|
||||
using Application = System.Windows.Application;
|
||||
using MessageBox = System.Windows.MessageBox;
|
||||
using Timer = System.Threading.Timer;
|
||||
@@ -353,18 +353,18 @@ namespace Ink_Canvas
|
||||
{
|
||||
return $"{timeSpan.Days}天 {timeSpan.Hours}小时 {timeSpan.Minutes}分钟";
|
||||
}
|
||||
else if (timeSpan.TotalHours >= 1)
|
||||
|
||||
if (timeSpan.TotalHours >= 1)
|
||||
{
|
||||
return $"{timeSpan.Hours}小时 {timeSpan.Minutes}分钟";
|
||||
}
|
||||
else if (timeSpan.TotalMinutes >= 1)
|
||||
|
||||
if (timeSpan.TotalMinutes >= 1)
|
||||
{
|
||||
return $"{timeSpan.Minutes}分钟 {timeSpan.Seconds}秒";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $"{timeSpan.Seconds}秒";
|
||||
}
|
||||
|
||||
return $"{timeSpan.Seconds}秒";
|
||||
}
|
||||
|
||||
// 新增:记录崩溃日志
|
||||
|
||||
@@ -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.8.4")]
|
||||
[assembly: AssemblyFileVersion("1.7.8.4")]
|
||||
[assembly: AssemblyVersion("1.7.9.0")]
|
||||
[assembly: AssemblyFileVersion("1.7.9.0")]
|
||||
|
||||
@@ -4,10 +4,10 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Threading;
|
||||
using System.Windows;
|
||||
|
||||
namespace Ink_Canvas.Helpers
|
||||
{
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
@@ -17,6 +15,8 @@ using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace Ink_Canvas.Helpers
|
||||
{
|
||||
@@ -1361,16 +1361,14 @@ namespace Ink_Canvas.Helpers
|
||||
|
||||
if (oldProcessId > 0 && !string.IsNullOrEmpty(extractPath) && !string.IsNullOrEmpty(targetPath))
|
||||
{
|
||||
LogHelper.WriteLogToFile($"AutoUpdate | 参数验证通过,启动更新任务");
|
||||
LogHelper.WriteLogToFile("AutoUpdate | 参数验证通过,启动更新任务");
|
||||
// 启动更新任务
|
||||
Task.Run(async () => await PerformUpdate(oldProcessId, extractPath, targetPath, isSilence));
|
||||
return true; // 返回true表示是更新模式
|
||||
}
|
||||
else
|
||||
{
|
||||
LogHelper.WriteLogToFile($"AutoUpdate | 参数验证失败 - 老进程ID: {oldProcessId}, 解压路径: {extractPath}, 目标路径: {targetPath}", LogHelper.LogType.Error);
|
||||
return false;
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile($"AutoUpdate | 参数验证失败 - 老进程ID: {oldProcessId}, 解压路径: {extractPath}, 目标路径: {targetPath}", LogHelper.LogType.Error);
|
||||
return false;
|
||||
}
|
||||
return false; // 返回false表示不是更新模式
|
||||
}
|
||||
@@ -1483,7 +1481,7 @@ namespace Ink_Canvas.Helpers
|
||||
}
|
||||
|
||||
// 删除ZIP文件
|
||||
string zipFile = Path.Combine(updatesFolderPath, $"InkCanvasForClass.CE.*.zip");
|
||||
string zipFile = Path.Combine(updatesFolderPath, "InkCanvasForClass.CE.*.zip");
|
||||
string[] zipFiles = Directory.GetFiles(updatesFolderPath, "InkCanvasForClass.CE.*.zip");
|
||||
foreach (string zip in zipFiles)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
@@ -6,7 +5,7 @@ using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Ink_Canvas.Helpers
|
||||
{
|
||||
@@ -350,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; }
|
||||
@@ -387,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; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据迁移:从分钟精度迁移到秒级精度
|
||||
/// </summary>
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查并重置每周统计数据(秒级精度)
|
||||
/// </summary>
|
||||
@@ -449,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)}");
|
||||
@@ -488,8 +429,6 @@ namespace Ink_Canvas.Helpers
|
||||
{
|
||||
CheckAndResetWeeklyStats();
|
||||
WeeklyUsageSeconds += seconds;
|
||||
// 同时更新旧字段以保持兼容性
|
||||
WeeklyUsageSeconds = WeeklyUsageSeconds / 60;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -587,9 +526,6 @@ namespace Ink_Canvas.Helpers
|
||||
{
|
||||
var stats = LoadUsageStats();
|
||||
|
||||
// 执行数据迁移(如果需要)
|
||||
stats.MigrateToSecondsPrecision();
|
||||
|
||||
// 计算本次会话时长(秒级精度)
|
||||
long sessionSeconds = 0;
|
||||
if (stats.LastLaunchTime != DateTime.MinValue)
|
||||
@@ -600,8 +536,7 @@ namespace Ink_Canvas.Helpers
|
||||
// 更新秒级精度数据
|
||||
stats.TotalUsageSeconds += sessionSeconds;
|
||||
|
||||
// 同时更新旧字段以保持兼容性
|
||||
stats.TotalUsageSeconds = stats.TotalUsageSeconds / 60;
|
||||
|
||||
|
||||
// 记录每周使用时长(秒级精度)
|
||||
stats.RecordWeeklyUsage(sessionSeconds);
|
||||
@@ -610,8 +545,7 @@ namespace Ink_Canvas.Helpers
|
||||
if (stats.LaunchCount > 0)
|
||||
{
|
||||
stats.AverageSessionSeconds = (double)stats.TotalUsageSeconds / stats.LaunchCount;
|
||||
// 同时更新旧字段以保持兼容性
|
||||
stats.AverageSessionSeconds = stats.AverageSessionSeconds / 60;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -649,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);
|
||||
@@ -731,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小时:新手用户
|
||||
@@ -792,25 +718,7 @@ namespace Ink_Canvas.Helpers
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取使用统计信息(兼容性方法 - 分钟精度)
|
||||
/// </summary>
|
||||
[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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 加载使用统计
|
||||
@@ -823,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;
|
||||
}
|
||||
|
||||
@@ -854,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
|
||||
@@ -914,21 +823,7 @@ namespace Ink_Canvas.Helpers
|
||||
return stats;
|
||||
}
|
||||
|
||||
// 如果解密失败,尝试作为普通JSON文件读取(向后兼容)
|
||||
try
|
||||
{
|
||||
string json = File.ReadAllText(filePath);
|
||||
var plainStats = JsonConvert.DeserializeObject<UsageStats>(json);
|
||||
if (plainStats != null && !string.IsNullOrEmpty(plainStats.DeviceId))
|
||||
{
|
||||
LogHelper.WriteLogToFile($"DeviceIdentifier | 从普通JSON文件加载使用统计: {filePath}");
|
||||
return plainStats;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 忽略JSON解析错误
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -998,7 +893,7 @@ namespace Ink_Canvas.Helpers
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <summary>
|
||||
/// 保存使用统计到文件(加密)
|
||||
/// </summary>
|
||||
private static void SaveUsageStatsToFile(string filePath, UsageStats stats)
|
||||
@@ -1063,45 +958,7 @@ namespace Ink_Canvas.Helpers
|
||||
LogHelper.WriteLogToFile($"DeviceIdentifier | 记录更新检查失败: {ex.Message}", LogHelper.LogType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 验证使用统计数据的完整性
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 从备份文件恢复使用统计数据
|
||||
@@ -1430,26 +1287,6 @@ namespace Ink_Canvas.Helpers
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查是否应该进行版本修复(不受分级策略影响)
|
||||
/// </summary>
|
||||
/// <param name="currentVersion">当前版本</param>
|
||||
/// <param name="availableVersion">可用版本</param>
|
||||
/// <returns>是否需要版本修复</returns>
|
||||
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; // 出错时默认允许
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -1502,9 +1339,7 @@ namespace Ink_Canvas.Helpers
|
||||
|
||||
return descriptions.Count > 0 ? string.Join(", ", descriptions) : "普通用户";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 关机时保存使用时间数据
|
||||
/// </summary>
|
||||
@@ -1512,14 +1347,14 @@ namespace Ink_Canvas.Helpers
|
||||
{
|
||||
try
|
||||
{
|
||||
LogHelper.WriteLogToFile("DeviceIdentifier | 开始关机时保存使用时间数据", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("DeviceIdentifier | 开始关机时保存使用时间数据");
|
||||
|
||||
// 1. 加载现有使用统计数据
|
||||
var stats = LoadUsageStats();
|
||||
if (stats == null)
|
||||
{
|
||||
stats = new UsageStats { DeviceId = DeviceId };
|
||||
LogHelper.WriteLogToFile("DeviceIdentifier | 创建新的使用统计数据", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("DeviceIdentifier | 创建新的使用统计数据");
|
||||
}
|
||||
|
||||
// 2. 计算本次会话时长(防止异常值)
|
||||
@@ -1542,7 +1377,7 @@ namespace Ink_Canvas.Helpers
|
||||
// 4. 保存数据
|
||||
SaveUsageStats(stats);
|
||||
|
||||
LogHelper.WriteLogToFile("DeviceIdentifier | 关机保存完成", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("DeviceIdentifier | 关机保存完成");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Input;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Windows.Input;
|
||||
using Newtonsoft.Json;
|
||||
using NHotkey.Wpf;
|
||||
|
||||
@@ -16,7 +17,7 @@ namespace Ink_Canvas.Helpers
|
||||
#region Private Fields
|
||||
private readonly Dictionary<string, HotkeyInfo> _registeredHotkeys;
|
||||
private readonly MainWindow _mainWindow;
|
||||
private bool _isDisposed = false;
|
||||
private bool _isDisposed;
|
||||
private bool _hotkeysShouldBeRegistered = true; // 启动时注册热键
|
||||
|
||||
// 配置文件路径
|
||||
@@ -175,12 +176,12 @@ namespace Ink_Canvas.Helpers
|
||||
{
|
||||
if (!File.Exists(HotkeyConfigFile))
|
||||
{
|
||||
LogHelper.WriteLogToFile("快捷键配置文件不存在", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("快捷键配置文件不存在");
|
||||
return new List<HotkeyInfo>();
|
||||
}
|
||||
|
||||
// 读取配置文件内容
|
||||
string jsonContent = File.ReadAllText(HotkeyConfigFile, System.Text.Encoding.UTF8);
|
||||
string jsonContent = File.ReadAllText(HotkeyConfigFile, Encoding.UTF8);
|
||||
if (string.IsNullOrEmpty(jsonContent))
|
||||
{
|
||||
LogHelper.WriteLogToFile("快捷键配置文件为空", LogHelper.LogType.Warning);
|
||||
@@ -208,7 +209,7 @@ namespace Ink_Canvas.Helpers
|
||||
});
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile($"从配置文件读取到 {hotkeyList.Count} 个快捷键信息", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"从配置文件读取到 {hotkeyList.Count} 个快捷键信息");
|
||||
return hotkeyList;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -284,14 +285,14 @@ namespace Ink_Canvas.Helpers
|
||||
{
|
||||
// 成功从配置文件加载快捷键设置
|
||||
_hotkeysShouldBeRegistered = true;
|
||||
LogHelper.WriteLogToFile("成功从配置文件加载快捷键设置", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("成功从配置文件加载快捷键设置");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果配置文件不存在或加载失败,使用默认快捷键
|
||||
if (!File.Exists(HotkeyConfigFile))
|
||||
{
|
||||
LogHelper.WriteLogToFile("配置文件不存在,注册默认快捷键", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("配置文件不存在,注册默认快捷键");
|
||||
RegisterDefaultHotkeys();
|
||||
_hotkeysShouldBeRegistered = true;
|
||||
}
|
||||
@@ -345,14 +346,14 @@ namespace Ink_Canvas.Helpers
|
||||
if (!_hotkeysShouldBeRegistered)
|
||||
{
|
||||
_hotkeysShouldBeRegistered = true;
|
||||
LogHelper.WriteLogToFile("启用快捷键注册功能", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("启用快捷键注册功能");
|
||||
|
||||
// 立即加载快捷键设置
|
||||
LoadHotkeysFromSettings();
|
||||
}
|
||||
else
|
||||
{
|
||||
LogHelper.WriteLogToFile("快捷键注册功能已经启用,重新加载快捷键设置", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("快捷键注册功能已经启用,重新加载快捷键设置");
|
||||
// 即使已经启用,也要重新加载快捷键设置以确保快捷键正常工作
|
||||
LoadHotkeysFromSettings();
|
||||
}
|
||||
@@ -374,14 +375,14 @@ namespace Ink_Canvas.Helpers
|
||||
if (_hotkeysShouldBeRegistered)
|
||||
{
|
||||
_hotkeysShouldBeRegistered = false;
|
||||
LogHelper.WriteLogToFile("禁用快捷键注册功能", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("禁用快捷键注册功能");
|
||||
|
||||
// 注销所有快捷键
|
||||
UnregisterAllHotkeys();
|
||||
}
|
||||
else
|
||||
{
|
||||
LogHelper.WriteLogToFile("快捷键注册功能已经禁用", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("快捷键注册功能已经禁用");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -403,13 +404,13 @@ namespace Ink_Canvas.Helpers
|
||||
{
|
||||
// 鼠标模式下禁用快捷键,让键盘操作放行
|
||||
DisableHotkeyRegistration();
|
||||
LogHelper.WriteLogToFile("切换到鼠标模式,禁用快捷键以放行键盘操作", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("切换到鼠标模式,禁用快捷键以放行键盘操作");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 非鼠标模式下启用快捷键
|
||||
EnableHotkeyRegistration();
|
||||
LogHelper.WriteLogToFile("切换到非鼠标模式,启用快捷键", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("切换到非鼠标模式,启用快捷键");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -509,7 +510,7 @@ namespace Ink_Canvas.Helpers
|
||||
}
|
||||
|
||||
// 读取配置文件内容
|
||||
string jsonContent = File.ReadAllText(HotkeyConfigFile, System.Text.Encoding.UTF8);
|
||||
string jsonContent = File.ReadAllText(HotkeyConfigFile, Encoding.UTF8);
|
||||
if (string.IsNullOrEmpty(jsonContent))
|
||||
{
|
||||
LogHelper.WriteLogToFile("快捷键配置文件为空", LogHelper.LogType.Warning);
|
||||
@@ -607,7 +608,7 @@ namespace Ink_Canvas.Helpers
|
||||
string jsonContent = JsonConvert.SerializeObject(config, settings);
|
||||
|
||||
// 直接写入原文件,覆盖原有内容
|
||||
File.WriteAllText(HotkeyConfigFile, jsonContent, System.Text.Encoding.UTF8);
|
||||
File.WriteAllText(HotkeyConfigFile, jsonContent, Encoding.UTF8);
|
||||
|
||||
LogHelper.WriteLogToFile($"快捷键配置已保存到: {HotkeyConfigFile}", LogHelper.LogType.Event);
|
||||
return true;
|
||||
@@ -714,33 +715,29 @@ namespace Ink_Canvas.Helpers
|
||||
var getLeftMethod = canvasType.GetMethod("GetLeft", BindingFlags.Public | BindingFlags.Static);
|
||||
if (getLeftMethod != null)
|
||||
{
|
||||
var leftPosition = getLeftMethod.Invoke(null, new object[] { floatingbarSelectionBG });
|
||||
var leftPosition = getLeftMethod.Invoke(null, new[] { floatingbarSelectionBG });
|
||||
if (leftPosition != null)
|
||||
{
|
||||
var position = Convert.ToDouble(leftPosition);
|
||||
|
||||
// 根据高光位置判断当前选中的工具
|
||||
// 位置计算基于SetFloatingBarHighlightPosition方法中的逻辑
|
||||
bool isMouseMode = false;
|
||||
string currentTool = "unknown";
|
||||
|
||||
bool isMouseMode;
|
||||
|
||||
// 简化判断:如果位置接近0,说明是鼠标模式
|
||||
// 如果位置接近28,说明是批注模式
|
||||
// 如果位置更大,说明是其他工具
|
||||
if (position < 5) // 鼠标模式:marginOffset + (cursorWidth - actualHighlightWidth) / 2 ≈ 0
|
||||
{
|
||||
isMouseMode = true;
|
||||
currentTool = "鼠标";
|
||||
}
|
||||
else if (position < 35) // 批注模式:marginOffset + cursorWidth + (penWidth - actualHighlightWidth) / 2 ≈ 28
|
||||
{
|
||||
isMouseMode = false;
|
||||
currentTool = "批注";
|
||||
}
|
||||
else // 其他工具(橡皮擦、选择等)
|
||||
{
|
||||
isMouseMode = false;
|
||||
currentTool = "其他工具";
|
||||
}
|
||||
|
||||
return isMouseMode;
|
||||
|
||||
@@ -16,7 +16,6 @@ namespace Ink_Canvas.Helpers
|
||||
{
|
||||
private readonly RenderTargetBitmap _renderTarget;
|
||||
private readonly DrawingVisual _drawingVisual;
|
||||
private readonly DrawingContext _drawingContext;
|
||||
private bool _isInitialized;
|
||||
|
||||
public HardwareAcceleratedInkProcessor(int width = 1920, int height = 1080)
|
||||
@@ -191,7 +190,6 @@ namespace Ink_Canvas.Helpers
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
_drawingContext?.Close();
|
||||
_renderTarget?.Clear();
|
||||
_isInitialized = false;
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Threading;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Threading;
|
||||
|
||||
namespace Ink_Canvas.Helpers
|
||||
{
|
||||
@@ -20,7 +20,7 @@ namespace Ink_Canvas.Helpers
|
||||
/// <summary>
|
||||
/// 是否启用墨迹渐隐功能
|
||||
/// </summary>
|
||||
public bool IsEnabled { get; set; } = false;
|
||||
public bool IsEnabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 墨迹渐隐时间(毫秒)
|
||||
@@ -258,7 +258,7 @@ namespace Ink_Canvas.Helpers
|
||||
public void Enable()
|
||||
{
|
||||
IsEnabled = true;
|
||||
LogHelper.WriteLogToFile("墨迹渐隐功能已启用", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("墨迹渐隐功能已启用");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -267,7 +267,7 @@ namespace Ink_Canvas.Helpers
|
||||
public void Disable()
|
||||
{
|
||||
IsEnabled = false;
|
||||
LogHelper.WriteLogToFile("墨迹渐隐功能已禁用", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("墨迹渐隐功能已禁用");
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using System.Configuration;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Ink_Canvas.Helpers
|
||||
{
|
||||
@@ -64,7 +64,7 @@ namespace Ink_Canvas.Helpers
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"加载平滑配置失败: {ex.Message}");
|
||||
Debug.WriteLine($"加载平滑配置失败: {ex.Message}");
|
||||
}
|
||||
|
||||
return config;
|
||||
@@ -125,7 +125,7 @@ namespace Ink_Canvas.Helpers
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"保存平滑配置失败: {ex.Message}");
|
||||
Debug.WriteLine($"保存平滑配置失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using Microsoft.Office.Interop.PowerPoint;
|
||||
using System;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Windows.Ink;
|
||||
using Microsoft.Office.Interop.PowerPoint;
|
||||
|
||||
namespace Ink_Canvas.Helpers
|
||||
{
|
||||
@@ -23,7 +23,7 @@ namespace Ink_Canvas.Helpers
|
||||
private int _maxSlides = 100;
|
||||
private string _currentPresentationId = "";
|
||||
private readonly object _lockObject = new object();
|
||||
private bool _disposed = false;
|
||||
private bool _disposed;
|
||||
|
||||
// 墨迹锁定机制,防止翻页时的墨迹冲突
|
||||
private DateTime _inkLockUntil = DateTime.MinValue;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Microsoft.Office.Interop.PowerPoint;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
@@ -8,6 +7,7 @@ using System.Text;
|
||||
using System.Threading;
|
||||
using System.Timers;
|
||||
using System.Windows.Threading;
|
||||
using Microsoft.Office.Interop.PowerPoint;
|
||||
using Application = System.Windows.Application;
|
||||
using Timer = System.Timers.Timer;
|
||||
|
||||
@@ -101,9 +101,9 @@ namespace Ink_Canvas.Helpers
|
||||
private int _wpsProcessCheckCount;
|
||||
private WpsWindowInfo _lastForegroundWpsWindow;
|
||||
private DateTime _lastWindowCheckTime = DateTime.MinValue;
|
||||
private bool _lastSlideShowState = false;
|
||||
private bool _lastSlideShowState;
|
||||
private readonly object _lockObject = new object();
|
||||
private bool _disposed = false;
|
||||
private bool _disposed;
|
||||
#endregion
|
||||
|
||||
#region Constructor & Initialization
|
||||
@@ -888,11 +888,9 @@ namespace Ink_Canvas.Helpers
|
||||
LogHelper.WriteLogToFile("成功显示幻灯片导航(PowerPoint模式)", LogHelper.LogType.Event);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
LogHelper.WriteLogToFile("SlideNavigation对象为空,可能是WPS不支持此功能", LogHelper.LogType.Warning);
|
||||
return false;
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile("SlideNavigation对象为空,可能是WPS不支持此功能", LogHelper.LogType.Warning);
|
||||
return false;
|
||||
}
|
||||
catch (COMException comEx)
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
|
||||
namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
|
||||
{
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
using Microsoft.Win32;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
@@ -10,6 +8,8 @@ using System.Windows;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Microsoft.Win32;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
|
||||
{
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
using Ink_Canvas.Windows;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using Ink_Canvas.Windows;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
|
||||
{
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
using Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
@@ -7,6 +5,8 @@ using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Media;
|
||||
using Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Ink_Canvas.Helpers.Plugins.BuiltIn
|
||||
{
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Ink_Canvas.Helpers.Plugins
|
||||
{
|
||||
@@ -46,17 +46,15 @@ namespace Ink_Canvas.Helpers.Plugins
|
||||
{
|
||||
return typedValue;
|
||||
}
|
||||
else
|
||||
|
||||
// 尝试类型转换
|
||||
try
|
||||
{
|
||||
// 尝试类型转换
|
||||
try
|
||||
{
|
||||
return (T)Convert.ChangeType(value, typeof(T));
|
||||
}
|
||||
catch
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
return (T)Convert.ChangeType(value, typeof(T));
|
||||
}
|
||||
catch
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
using Ink_Canvas.Windows;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
@@ -10,6 +8,8 @@ using System.Security.Cryptography;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using Ink_Canvas.Windows;
|
||||
using Newtonsoft.Json;
|
||||
using Timer = System.Timers.Timer;
|
||||
|
||||
namespace Ink_Canvas.Helpers.Plugins
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Media;
|
||||
using System.Linq;
|
||||
|
||||
namespace Ink_Canvas.Helpers.Plugins
|
||||
{
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Ink_Canvas.Helpers
|
||||
{
|
||||
|
||||
@@ -5159,7 +5159,7 @@
|
||||
<Run Text="图形" />
|
||||
<Run Text="(第一行支持长按保持选中)" FontSize="10" />
|
||||
</TextBlock>
|
||||
<ui:SymbolIcon Margin="0,-20,8,15" Symbol="Pin"
|
||||
<ui:FontIcon Margin="0,-20,8,15" Glyph=""
|
||||
MouseDown="Border_MouseDown"
|
||||
MouseUp="SymbolIconPinBorderDrawShape_MouseUp"
|
||||
Foreground="{DynamicResource FloatBarForeground}"
|
||||
|
||||
@@ -1,9 +1,3 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using Ink_Canvas.Helpers.Plugins;
|
||||
using Ink_Canvas.Windows;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
@@ -22,6 +16,12 @@ using System.Windows.Input;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Threading;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Ink_Canvas.Helpers.Plugins;
|
||||
using Ink_Canvas.Windows;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Microsoft.Win32;
|
||||
using Application = System.Windows.Application;
|
||||
using Brushes = System.Windows.Media.Brushes;
|
||||
using Button = System.Windows.Controls.Button;
|
||||
@@ -100,7 +100,11 @@ namespace Ink_Canvas
|
||||
(workingArea.Width - floatingBarWidth) / 2,
|
||||
workingArea.Bottom - 60 - workingArea.Top,
|
||||
-2000, -200);
|
||||
ViewboxFloatingBarMarginAnimation(100, true);
|
||||
// 新增:只在屏幕模式下初始化浮动栏动画
|
||||
if (currentMode == 0)
|
||||
{
|
||||
ViewboxFloatingBarMarginAnimation(100, true);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
@@ -996,14 +1000,19 @@ 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)
|
||||
{
|
||||
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
currentSelectedElement = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1684,7 +1693,7 @@ namespace Ink_Canvas
|
||||
|
||||
// 添加定时器来维护置顶状态
|
||||
private DispatcherTimer topmostMaintenanceTimer;
|
||||
private bool isTopmostMaintenanceEnabled = false;
|
||||
private bool isTopmostMaintenanceEnabled;
|
||||
|
||||
private void ApplyNoFocusMode()
|
||||
{
|
||||
@@ -1748,7 +1757,7 @@ namespace Ink_Canvas
|
||||
// 注意:这里不直接设置Topmost,让其他代码根据模式决定
|
||||
|
||||
// 添加调试日志
|
||||
LogHelper.WriteLogToFile($"应用窗口置顶: 取消置顶", LogHelper.LogType.Trace);
|
||||
LogHelper.WriteLogToFile("应用窗口置顶: 取消置顶", LogHelper.LogType.Trace);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using System;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
@@ -8,6 +6,8 @@ using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
@@ -263,16 +263,20 @@ namespace Ink_Canvas
|
||||
{
|
||||
var dops = Settings.PowerPointSettings.PPTButtonsDisplayOption.ToString();
|
||||
var dopsc = dops.ToCharArray();
|
||||
if (dopsc[0] == '2' && isDisplayingOrHidingBlackboard == false) AnimationsHelper.ShowWithFadeIn(LeftBottomPanelForPPTNavigation);
|
||||
if (dopsc[1] == '2' && isDisplayingOrHidingBlackboard == false) AnimationsHelper.ShowWithFadeIn(RightBottomPanelForPPTNavigation);
|
||||
if (dopsc[2] == '2' && isDisplayingOrHidingBlackboard == false) AnimationsHelper.ShowWithFadeIn(LeftSidePanelForPPTNavigation);
|
||||
if (dopsc[3] == '2' && isDisplayingOrHidingBlackboard == false) AnimationsHelper.ShowWithFadeIn(RightSidePanelForPPTNavigation);
|
||||
if (dopsc[0] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftBottomPanelForPPTNavigation);
|
||||
if (dopsc[1] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightBottomPanelForPPTNavigation);
|
||||
if (dopsc[2] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftSidePanelForPPTNavigation);
|
||||
if (dopsc[3] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightSidePanelForPPTNavigation);
|
||||
}
|
||||
|
||||
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
|
||||
ViewboxFloatingBarMarginAnimation(60);
|
||||
else
|
||||
ViewboxFloatingBarMarginAnimation(100, true);
|
||||
// 新增:只在屏幕模式下显示浮动栏
|
||||
if (currentMode == 0)
|
||||
{
|
||||
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
|
||||
ViewboxFloatingBarMarginAnimation(60);
|
||||
else
|
||||
ViewboxFloatingBarMarginAnimation(100, true);
|
||||
}
|
||||
SidePannelMarginAnimation(-50, !unfoldFloatingBarByUser);
|
||||
});
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using IWshRuntimeLibrary;
|
||||
using System;
|
||||
using System;
|
||||
using System.Windows;
|
||||
using IWshRuntimeLibrary;
|
||||
using Application = System.Windows.Forms.Application;
|
||||
using File = System.IO.File;
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using Microsoft.Win32;
|
||||
using Application = System.Windows.Application;
|
||||
|
||||
namespace Ink_Canvas
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
@@ -7,6 +6,7 @@ using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Media;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
@@ -130,6 +130,17 @@ namespace Ink_Canvas
|
||||
{
|
||||
try
|
||||
{
|
||||
// 隐藏图片选择工具栏
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
currentSelectedElement = null;
|
||||
}
|
||||
|
||||
var targetIndex = isBackupMain ? 0 : CurrentWhiteboardIndex;
|
||||
|
||||
// 先清空当前画布的墨迹
|
||||
@@ -209,7 +220,16 @@ namespace Ink_Canvas
|
||||
{
|
||||
if (CurrentWhiteboardIndex <= 1) return;
|
||||
|
||||
|
||||
// 隐藏图片选择工具栏
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
currentSelectedElement = null;
|
||||
}
|
||||
|
||||
SaveStrokes();
|
||||
|
||||
@@ -229,11 +249,21 @@ namespace Ink_Canvas
|
||||
inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) SaveScreenShot(true);
|
||||
if (CurrentWhiteboardIndex >= WhiteboardTotalCount)
|
||||
{
|
||||
// 在最后一页时,点击“新页面”按钮直接新增一页
|
||||
// 在最后一页时,点击"新页面"按钮直接新增一页
|
||||
BtnWhiteBoardAdd_Click(sender, e);
|
||||
return;
|
||||
}
|
||||
|
||||
// 隐藏图片选择工具栏
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
currentSelectedElement = null;
|
||||
}
|
||||
|
||||
SaveStrokes();
|
||||
|
||||
@@ -251,6 +281,17 @@ namespace Ink_Canvas
|
||||
if (Settings.Automation.IsAutoSaveStrokesAtClear &&
|
||||
inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) SaveScreenShot(true);
|
||||
|
||||
// 隐藏图片选择工具栏
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
currentSelectedElement = null;
|
||||
}
|
||||
|
||||
SaveStrokes();
|
||||
ClearStrokes(true);
|
||||
|
||||
@@ -279,6 +320,17 @@ namespace Ink_Canvas
|
||||
|
||||
private void BtnWhiteBoardDelete_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 隐藏图片选择工具栏
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
currentSelectedElement = null;
|
||||
}
|
||||
|
||||
ClearStrokes(true);
|
||||
|
||||
if (CurrentWhiteboardIndex != WhiteboardTotalCount)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
@@ -7,6 +6,7 @@ using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
@@ -766,7 +766,7 @@ namespace Ink_Canvas
|
||||
{
|
||||
PenIcon_Click(null, null);
|
||||
SymbolIconDelete_MouseUp(null, null);
|
||||
if (Settings.Canvas.ClearCanvasAndClearTimeMachine == false) timeMachine.ClearStrokeHistory();
|
||||
if (!Settings.Canvas.ClearCanvasAndClearTimeMachine) timeMachine.ClearStrokeHistory();
|
||||
|
||||
// 根据设置决定是否清空图片
|
||||
if (Settings.Canvas.ClearCanvasAlsoClearImages)
|
||||
|
||||
@@ -1,19 +1,26 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Threading;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Clipboard = System.Windows.Clipboard;
|
||||
using ContextMenu = System.Windows.Controls.ContextMenu;
|
||||
using Cursors = System.Windows.Input.Cursors;
|
||||
using MenuItem = System.Windows.Controls.MenuItem;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
private bool isClipboardMonitoringEnabled = false;
|
||||
private BitmapSource lastClipboardImage = null;
|
||||
private bool isClipboardMonitoringEnabled;
|
||||
private BitmapSource lastClipboardImage;
|
||||
|
||||
// 初始化剪贴板监控
|
||||
private void InitializeClipboardMonitoring()
|
||||
@@ -92,7 +99,7 @@ namespace Ink_Canvas
|
||||
// 显示菜单
|
||||
contextMenu.IsOpen = true;
|
||||
contextMenu.PlacementTarget = inkCanvas;
|
||||
contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.MousePoint;
|
||||
contextMenu.Placement = PlacementMode.MousePoint;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -124,7 +131,7 @@ namespace Ink_Canvas
|
||||
Source = clipboardImage,
|
||||
Width = clipboardImage.PixelWidth,
|
||||
Height = clipboardImage.PixelHeight,
|
||||
Stretch = System.Windows.Media.Stretch.Fill
|
||||
Stretch = Stretch.Fill
|
||||
};
|
||||
|
||||
// 生成唯一名称
|
||||
@@ -141,19 +148,6 @@ namespace Ink_Canvas
|
||||
element.RenderTransform = transformGroup;
|
||||
}
|
||||
|
||||
// 设置位置
|
||||
if (position.HasValue)
|
||||
{
|
||||
// 在指定位置居中显示
|
||||
InkCanvas.SetLeft(image, position.Value.X - image.Width / 2);
|
||||
InkCanvas.SetTop(image, position.Value.Y - image.Height / 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 使用与文件选择相同的居中和缩放逻辑
|
||||
CenterAndScaleElement(image);
|
||||
}
|
||||
|
||||
// 设置图片属性,避免被InkCanvas选择系统处理
|
||||
image.IsHitTestVisible = true;
|
||||
image.Focusable = false;
|
||||
@@ -163,31 +157,50 @@ namespace Ink_Canvas
|
||||
{
|
||||
// 清除当前选择,避免显示控制点
|
||||
inkCanvas.Select(new StrokeCollection());
|
||||
// 设置编辑模式为Ink模式,这样可以保持图片的交互功能
|
||||
// 设置编辑模式为非选择模式,这样可以保持图片的交互功能
|
||||
// 同时通过图片的IsHitTestVisible和Focusable属性来避免InkCanvas选择系统的干扰
|
||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||
}
|
||||
|
||||
// 添加到画布
|
||||
inkCanvas.Children.Add(image);
|
||||
|
||||
// 绑定事件处理器
|
||||
if (image is FrameworkElement elementForEvents)
|
||||
// 等待图片加载完成后再进行居中处理
|
||||
image.Loaded += (sender, e) =>
|
||||
{
|
||||
// 鼠标事件
|
||||
elementForEvents.MouseLeftButtonDown += Element_MouseLeftButtonDown;
|
||||
elementForEvents.MouseLeftButtonUp += Element_MouseLeftButtonUp;
|
||||
elementForEvents.MouseMove += Element_MouseMove;
|
||||
elementForEvents.MouseWheel += Element_MouseWheel;
|
||||
// 确保在UI线程中执行
|
||||
Dispatcher.BeginInvoke(new Action(() =>
|
||||
{
|
||||
// 先进行缩放居中处理
|
||||
CenterAndScaleElement(image);
|
||||
|
||||
// 如果有指定位置,调整到指定位置
|
||||
if (position.HasValue)
|
||||
{
|
||||
// 在指定位置居中显示
|
||||
InkCanvas.SetLeft(image, position.Value.X - image.Width / 2);
|
||||
InkCanvas.SetTop(image, position.Value.Y - image.Height / 2);
|
||||
}
|
||||
|
||||
// 绑定事件处理器
|
||||
if (image is FrameworkElement elementForEvents)
|
||||
{
|
||||
// 鼠标事件
|
||||
elementForEvents.MouseLeftButtonDown += Element_MouseLeftButtonDown;
|
||||
elementForEvents.MouseLeftButtonUp += Element_MouseLeftButtonUp;
|
||||
elementForEvents.MouseMove += Element_MouseMove;
|
||||
elementForEvents.MouseWheel += Element_MouseWheel;
|
||||
|
||||
// 触摸事件
|
||||
elementForEvents.IsManipulationEnabled = true;
|
||||
elementForEvents.ManipulationDelta += Element_ManipulationDelta;
|
||||
elementForEvents.ManipulationCompleted += Element_ManipulationCompleted;
|
||||
// 触摸事件
|
||||
elementForEvents.IsManipulationEnabled = true;
|
||||
elementForEvents.ManipulationDelta += Element_ManipulationDelta;
|
||||
elementForEvents.ManipulationCompleted += Element_ManipulationCompleted;
|
||||
|
||||
// 设置光标
|
||||
elementForEvents.Cursor = Cursors.Hand;
|
||||
}
|
||||
// 设置光标
|
||||
elementForEvents.Cursor = Cursors.Hand;
|
||||
}
|
||||
}), DispatcherPriority.Loaded);
|
||||
};
|
||||
|
||||
// 提交到历史记录
|
||||
timeMachine.CommitElementInsertHistory(image);
|
||||
@@ -266,13 +279,13 @@ namespace Ink_Canvas
|
||||
{
|
||||
public static event Action ClipboardUpdate;
|
||||
|
||||
private static System.Windows.Forms.Timer clipboardTimer;
|
||||
private static Timer clipboardTimer;
|
||||
private static string lastClipboardText = "";
|
||||
private static bool lastHadImage = false;
|
||||
private static bool lastHadImage;
|
||||
|
||||
static ClipboardNotification()
|
||||
{
|
||||
clipboardTimer = new System.Windows.Forms.Timer();
|
||||
clipboardTimer = new Timer();
|
||||
clipboardTimer.Interval = 500; // 每500ms检查一次
|
||||
clipboardTimer.Tick += CheckClipboard;
|
||||
clipboardTimer.Start();
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
@@ -9,6 +8,7 @@ using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Threading;
|
||||
using Ink_Canvas.Helpers;
|
||||
using System.Windows.Input;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Ink;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
@@ -19,9 +19,8 @@ namespace Ink_Canvas
|
||||
{
|
||||
// 当前选中的可操作元素
|
||||
private FrameworkElement currentSelectedElement;
|
||||
private bool isDragging = false;
|
||||
private bool isDragging;
|
||||
private Point dragStartPoint;
|
||||
private bool isElementSelected = false;
|
||||
|
||||
#region Image
|
||||
private async void BtnImageInsert_Click(object sender, RoutedEventArgs e)
|
||||
@@ -65,7 +64,7 @@ namespace Ink_Canvas
|
||||
BindElementEvents(image);
|
||||
|
||||
LogHelper.WriteLogToFile($"图片插入完成: {image.Name}");
|
||||
}), System.Windows.Threading.DispatcherPriority.Loaded);
|
||||
}), DispatcherPriority.Loaded);
|
||||
};
|
||||
|
||||
timeMachine.CommitElementInsertHistory(image);
|
||||
@@ -110,12 +109,14 @@ namespace Ink_Canvas
|
||||
{
|
||||
if (sender is FrameworkElement element)
|
||||
{
|
||||
|
||||
|
||||
// 取消之前选中的元素
|
||||
if (currentSelectedElement != null && currentSelectedElement != element)
|
||||
{
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
}
|
||||
|
||||
// 选中当前元素
|
||||
@@ -175,6 +176,12 @@ namespace Ink_Canvas
|
||||
// 使用滚轮缩放的核心机制
|
||||
ApplyWheelScaleTransform(element, e);
|
||||
|
||||
// 如果是图片元素,更新工具栏位置
|
||||
if (element is Image && BorderImageSelectionControl?.Visibility == Visibility.Visible)
|
||||
{
|
||||
UpdateImageSelectionToolbarPosition(element);
|
||||
}
|
||||
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
@@ -257,7 +264,6 @@ namespace Ink_Canvas
|
||||
private void SelectElement(FrameworkElement element)
|
||||
{
|
||||
currentSelectedElement = element;
|
||||
isElementSelected = true;
|
||||
|
||||
// 根据元素类型显示不同的选择工具栏
|
||||
if (element is Image)
|
||||
@@ -311,7 +317,6 @@ namespace Ink_Canvas
|
||||
private void UnselectElement(FrameworkElement element)
|
||||
{
|
||||
// 去除选中效果
|
||||
isElementSelected = false;
|
||||
|
||||
// 隐藏所有选择工具栏
|
||||
if (BorderImageSelectionControl != null)
|
||||
@@ -330,11 +335,7 @@ namespace Ink_Canvas
|
||||
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
// 恢复InkCanvas的编辑模式
|
||||
if (inkCanvas != null)
|
||||
{
|
||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 应用矩阵变换到元素
|
||||
@@ -397,7 +398,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
|
||||
// 保存初始变换状态用于历史记录
|
||||
var initialTransform = transformGroup.Clone() as TransformGroup;
|
||||
var initialTransform = transformGroup.Clone();
|
||||
|
||||
// 创建新的 TransformGroup 并添加 MatrixTransform
|
||||
var newTransformGroup = new TransformGroup();
|
||||
@@ -720,7 +721,7 @@ namespace Ink_Canvas
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 记录错误但不中断程序
|
||||
System.Diagnostics.Debug.WriteLine($"旋转图片时发生错误: {ex.Message}");
|
||||
Debug.WriteLine($"旋转图片时发生错误: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -741,26 +742,37 @@ namespace Ink_Canvas
|
||||
Width = image.Width,
|
||||
Height = image.Height,
|
||||
Stretch = image.Stretch,
|
||||
RenderTransform = image.RenderTransform?.Clone() as Transform
|
||||
RenderTransform = image.RenderTransform?.Clone()
|
||||
};
|
||||
|
||||
// 设置位置,稍微偏移以避免重叠
|
||||
InkCanvas.SetLeft(clonedImage, InkCanvas.GetLeft(image) + 20);
|
||||
InkCanvas.SetTop(clonedImage, InkCanvas.GetTop(image) + 20);
|
||||
|
||||
// 设置图片属性,避免被InkCanvas选择系统处理
|
||||
clonedImage.IsHitTestVisible = true;
|
||||
clonedImage.Focusable = false;
|
||||
|
||||
// 初始化变换
|
||||
InitializeElementTransform(clonedImage);
|
||||
|
||||
// 绑定事件
|
||||
BindElementEvents(clonedImage);
|
||||
|
||||
// 添加到画布
|
||||
inkCanvas.Children.Add(clonedImage);
|
||||
|
||||
// 提交到时间机器以支持撤销
|
||||
timeMachine.CommitElementInsertHistory(clonedImage);
|
||||
|
||||
return clonedImage;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 记录错误但不中断程序
|
||||
System.Diagnostics.Debug.WriteLine($"克隆图片时发生错误: {ex.Message}");
|
||||
LogHelper.WriteLogToFile($"克隆图片时发生错误: {ex.Message}", LogHelper.LogType.Error);
|
||||
return null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -780,7 +792,7 @@ namespace Ink_Canvas
|
||||
Width = image.Width,
|
||||
Height = image.Height,
|
||||
Stretch = image.Stretch,
|
||||
RenderTransform = image.RenderTransform?.Clone() as Transform
|
||||
RenderTransform = image.RenderTransform?.Clone()
|
||||
};
|
||||
|
||||
// 设置位置,稍微偏移以避免重叠
|
||||
@@ -799,7 +811,7 @@ namespace Ink_Canvas
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 记录错误但不中断程序
|
||||
System.Diagnostics.Debug.WriteLine($"克隆图片到新页面时发生错误: {ex.Message}");
|
||||
Debug.WriteLine($"克隆图片到新页面时发生错误: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -852,7 +864,7 @@ namespace Ink_Canvas
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 记录错误但不中断程序
|
||||
System.Diagnostics.Debug.WriteLine($"缩放图片时发生错误: {ex.Message}");
|
||||
Debug.WriteLine($"缩放图片时发生错误: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -878,7 +890,7 @@ namespace Ink_Canvas
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 记录错误但不中断程序
|
||||
System.Diagnostics.Debug.WriteLine($"删除图片时发生错误: {ex.Message}");
|
||||
Debug.WriteLine($"删除图片时发生错误: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -897,7 +909,7 @@ namespace Ink_Canvas
|
||||
Dispatcher.BeginInvoke(new Action(() =>
|
||||
{
|
||||
CenterAndScaleElement(element);
|
||||
}), System.Windows.Threading.DispatcherPriority.Loaded);
|
||||
}), DispatcherPriority.Loaded);
|
||||
};
|
||||
return;
|
||||
}
|
||||
@@ -909,8 +921,8 @@ namespace Ink_Canvas
|
||||
// 如果画布尺寸为0,使用窗口尺寸作为备选
|
||||
if (canvasWidth <= 0 || canvasHeight <= 0)
|
||||
{
|
||||
canvasWidth = this.ActualWidth;
|
||||
canvasHeight = this.ActualHeight;
|
||||
canvasWidth = ActualWidth;
|
||||
canvasHeight = ActualHeight;
|
||||
}
|
||||
|
||||
// 如果仍然为0,使用屏幕尺寸
|
||||
@@ -994,19 +1006,12 @@ namespace Ink_Canvas
|
||||
{
|
||||
if (BorderImageSelectionControl == null || element == null) return;
|
||||
|
||||
// 获取元素在画布中的位置
|
||||
double elementLeft = InkCanvas.GetLeft(element);
|
||||
double elementTop = InkCanvas.GetTop(element);
|
||||
double elementWidth = element.ActualWidth;
|
||||
double elementHeight = element.ActualHeight;
|
||||
|
||||
// 如果元素位置未设置,使用默认值
|
||||
if (double.IsNaN(elementLeft)) elementLeft = 0;
|
||||
if (double.IsNaN(elementTop)) elementTop = 0;
|
||||
// 获取元素的实际边界(考虑变换)
|
||||
Rect elementBounds = GetElementActualBounds(element);
|
||||
|
||||
// 计算工具栏位置(显示在图片下方)
|
||||
double toolbarLeft = elementLeft + (elementWidth / 2) - (BorderImageSelectionControl.ActualWidth / 2);
|
||||
double toolbarTop = elementTop + elementHeight + 10; // 图片下方10像素
|
||||
double toolbarLeft = elementBounds.Left + (elementBounds.Width / 2) - (BorderImageSelectionControl.ActualWidth / 2);
|
||||
double toolbarTop = elementBounds.Bottom + 10; // 图片下方10像素
|
||||
|
||||
// 确保工具栏不超出画布边界
|
||||
double maxLeft = inkCanvas.ActualWidth - BorderImageSelectionControl.ActualWidth;
|
||||
@@ -1024,6 +1029,53 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
// 获取元素的实际边界(考虑变换)
|
||||
private Rect GetElementActualBounds(FrameworkElement element)
|
||||
{
|
||||
try
|
||||
{
|
||||
var left = InkCanvas.GetLeft(element);
|
||||
var top = InkCanvas.GetTop(element);
|
||||
|
||||
if (double.IsNaN(left)) left = 0;
|
||||
if (double.IsNaN(top)) top = 0;
|
||||
|
||||
var width = element.ActualWidth > 0 ? element.ActualWidth : element.Width;
|
||||
var height = element.ActualHeight > 0 ? element.ActualHeight : element.Height;
|
||||
|
||||
// 检查是否有RenderTransform
|
||||
if (element.RenderTransform != null && element.RenderTransform != Transform.Identity)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 如果有变换,使用变换后的边界
|
||||
var transform = element.TransformToAncestor(inkCanvas);
|
||||
var elementBounds = new Rect(0, 0, width, height);
|
||||
var transformedBounds = transform.TransformBounds(elementBounds);
|
||||
return transformedBounds;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 变换失败时回退到简单计算
|
||||
return new Rect(left, top, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
// 没有变换时直接使用位置和大小
|
||||
return new Rect(left, top, width, height);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"获取元素实际边界失败: {ex.Message}", LogHelper.LogType.Error);
|
||||
// 回退到基本计算
|
||||
var left = InkCanvas.GetLeft(element);
|
||||
var top = InkCanvas.GetTop(element);
|
||||
if (double.IsNaN(left)) left = 0;
|
||||
if (double.IsNaN(top)) top = 0;
|
||||
return new Rect(left, top, element.ActualWidth, element.ActualHeight);
|
||||
}
|
||||
}
|
||||
|
||||
#region Image Selection Toolbar Event Handlers
|
||||
|
||||
// 图片克隆功能
|
||||
@@ -1064,23 +1116,32 @@ namespace Ink_Canvas
|
||||
{
|
||||
if (currentSelectedElement is Image originalImage)
|
||||
{
|
||||
// 创建克隆图片
|
||||
Image clonedImage = CloneImage(originalImage);
|
||||
// 创建新页面
|
||||
BtnWhiteBoardAdd_Click(null, null);
|
||||
|
||||
// 这里可以添加切换到新页面的逻辑
|
||||
// 暂时先添加到当前页面
|
||||
inkCanvas.Children.Add(clonedImage);
|
||||
// 创建克隆图片(不添加到当前画布,因为已经创建了新页面)
|
||||
Image clonedImage = CreateClonedImage(originalImage);
|
||||
|
||||
// 初始化变换
|
||||
InitializeElementTransform(clonedImage);
|
||||
|
||||
// 绑定事件
|
||||
BindElementEvents(clonedImage);
|
||||
|
||||
// 记录历史
|
||||
timeMachine.CommitElementInsertHistory(clonedImage);
|
||||
|
||||
LogHelper.WriteLogToFile($"图片克隆到新页面完成: {clonedImage.Name}");
|
||||
if (clonedImage != null)
|
||||
{
|
||||
// 设置图片属性,避免被InkCanvas选择系统处理
|
||||
clonedImage.IsHitTestVisible = true;
|
||||
clonedImage.Focusable = false;
|
||||
|
||||
// 初始化变换
|
||||
InitializeElementTransform(clonedImage);
|
||||
|
||||
// 绑定事件
|
||||
BindElementEvents(clonedImage);
|
||||
|
||||
// 添加到新页面的画布
|
||||
inkCanvas.Children.Add(clonedImage);
|
||||
|
||||
// 记录历史
|
||||
timeMachine.CommitElementInsertHistory(clonedImage);
|
||||
|
||||
LogHelper.WriteLogToFile($"图片克隆到新页面完成: {clonedImage.Name}");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -1097,7 +1158,14 @@ namespace Ink_Canvas
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
ApplyRotateTransform(currentSelectedElement, -45);
|
||||
LogHelper.WriteLogToFile($"图片左旋转完成");
|
||||
|
||||
// 更新工具栏位置
|
||||
if (currentSelectedElement is Image && BorderImageSelectionControl?.Visibility == Visibility.Visible)
|
||||
{
|
||||
UpdateImageSelectionToolbarPosition(currentSelectedElement);
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile("图片左旋转完成");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -1114,7 +1182,14 @@ namespace Ink_Canvas
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
ApplyRotateTransform(currentSelectedElement, 45);
|
||||
LogHelper.WriteLogToFile($"图片右旋转完成");
|
||||
|
||||
// 更新工具栏位置
|
||||
if (currentSelectedElement is Image && BorderImageSelectionControl?.Visibility == Visibility.Visible)
|
||||
{
|
||||
UpdateImageSelectionToolbarPosition(currentSelectedElement);
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile("图片右旋转完成");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -1132,7 +1207,14 @@ namespace Ink_Canvas
|
||||
{
|
||||
var elementCenter = new Point(currentSelectedElement.ActualWidth / 2, currentSelectedElement.ActualHeight / 2);
|
||||
ApplyScaleTransform(currentSelectedElement, 0.9, elementCenter);
|
||||
LogHelper.WriteLogToFile($"图片缩放减小完成");
|
||||
|
||||
// 更新工具栏位置
|
||||
if (currentSelectedElement is Image && BorderImageSelectionControl?.Visibility == Visibility.Visible)
|
||||
{
|
||||
UpdateImageSelectionToolbarPosition(currentSelectedElement);
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile("图片缩放减小完成");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -1147,17 +1229,24 @@ namespace Ink_Canvas
|
||||
try
|
||||
{
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
var elementCenter = new Point(currentSelectedElement.ActualWidth / 2, currentSelectedElement.ActualHeight / 2);
|
||||
ApplyScaleTransform(currentSelectedElement, 1.1, elementCenter);
|
||||
LogHelper.WriteLogToFile($"图片缩放增大完成");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"图片缩放增大失败: {ex.Message}", LogHelper.LogType.Error);
|
||||
var elementCenter = new Point(currentSelectedElement.ActualWidth / 2, currentSelectedElement.ActualHeight / 2);
|
||||
ApplyScaleTransform(currentSelectedElement, 1.1, elementCenter);
|
||||
|
||||
// 更新工具栏位置
|
||||
if (currentSelectedElement is Image && BorderImageSelectionControl?.Visibility == Visibility.Visible)
|
||||
{
|
||||
UpdateImageSelectionToolbarPosition(currentSelectedElement);
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile("图片缩放增大完成");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"图片缩放增大失败: {ex.Message}", LogHelper.LogType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
// 图片删除
|
||||
private void BorderImageDelete_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
@@ -1166,6 +1255,9 @@ namespace Ink_Canvas
|
||||
{
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
// 保存删除前的编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
|
||||
// 记录删除历史
|
||||
timeMachine.CommitElementRemoveHistory(currentSelectedElement);
|
||||
|
||||
@@ -1176,7 +1268,10 @@ namespace Ink_Canvas
|
||||
UnselectElement(currentSelectedElement);
|
||||
currentSelectedElement = null;
|
||||
|
||||
LogHelper.WriteLogToFile($"图片删除完成");
|
||||
// 恢复到删除前的编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
|
||||
LogHelper.WriteLogToFile($"图片删除完成,已恢复到编辑模式: {previousEditingMode}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -1185,7 +1280,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
// 克隆图片的辅助方法
|
||||
// 克隆图片的辅助方法(只创建图片,不添加到画布)
|
||||
private Image CreateClonedImage(Image originalImage)
|
||||
{
|
||||
try
|
||||
@@ -1204,7 +1299,7 @@ namespace Ink_Canvas
|
||||
clonedImage.Stretch = originalImage.Stretch;
|
||||
clonedImage.StretchDirection = originalImage.StretchDirection;
|
||||
|
||||
// 复制位置
|
||||
// 复制位置(在新页面中居中显示)
|
||||
double left = InkCanvas.GetLeft(originalImage);
|
||||
double top = InkCanvas.GetTop(originalImage);
|
||||
InkCanvas.SetLeft(clonedImage, left + 20); // 稍微偏移位置
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
@@ -7,6 +6,7 @@ using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
@@ -13,6 +11,8 @@ using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using Application = System.Windows.Application;
|
||||
using Button = System.Windows.Controls.Button;
|
||||
using Cursors = System.Windows.Input.Cursors;
|
||||
@@ -641,6 +641,9 @@ namespace Ink_Canvas
|
||||
ICCWaterMarkWhite.Visibility = Visibility.Visible;
|
||||
ICCWaterMarkDark.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
// 新增:确保在白板模式下基础浮动栏被隐藏
|
||||
ViewboxFloatingBar.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -651,10 +654,10 @@ namespace Ink_Canvas
|
||||
{
|
||||
var dops = Settings.PowerPointSettings.PPTButtonsDisplayOption.ToString();
|
||||
var dopsc = dops.ToCharArray();
|
||||
if (dopsc[0] == '2' && isDisplayingOrHidingBlackboard == false) AnimationsHelper.ShowWithFadeIn(LeftBottomPanelForPPTNavigation);
|
||||
if (dopsc[1] == '2' && isDisplayingOrHidingBlackboard == false) AnimationsHelper.ShowWithFadeIn(RightBottomPanelForPPTNavigation);
|
||||
if (dopsc[2] == '2' && isDisplayingOrHidingBlackboard == false) AnimationsHelper.ShowWithFadeIn(LeftSidePanelForPPTNavigation);
|
||||
if (dopsc[3] == '2' && isDisplayingOrHidingBlackboard == false) AnimationsHelper.ShowWithFadeIn(RightSidePanelForPPTNavigation);
|
||||
if (dopsc[0] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftBottomPanelForPPTNavigation);
|
||||
if (dopsc[1] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightBottomPanelForPPTNavigation);
|
||||
if (dopsc[2] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(LeftSidePanelForPPTNavigation);
|
||||
if (dopsc[3] == '2' && !isDisplayingOrHidingBlackboard) AnimationsHelper.ShowWithFadeIn(RightSidePanelForPPTNavigation);
|
||||
}
|
||||
// 修复PPT放映时点击白板按钮后翻页按钮不显示的问题
|
||||
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
|
||||
@@ -693,6 +696,9 @@ namespace Ink_Canvas
|
||||
BlackBoardWaterMark.Visibility = Visibility.Collapsed;
|
||||
ICCWaterMarkDark.Visibility = Visibility.Collapsed;
|
||||
ICCWaterMarkWhite.Visibility = Visibility.Collapsed;
|
||||
|
||||
// 新增:退出白板模式时恢复基础浮动栏的显示
|
||||
ViewboxFloatingBar.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
BtnSwitch_Click(BtnSwitch, null);
|
||||
@@ -1292,10 +1298,16 @@ namespace Ink_Canvas
|
||||
public async void ViewboxFloatingBarMarginAnimation(int MarginFromEdge,
|
||||
bool PosXCaculatedWithTaskbarHeight = false)
|
||||
{
|
||||
// 新增:在白板模式下不执行浮动栏动画
|
||||
if (currentMode == 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (MarginFromEdge == 60) MarginFromEdge = 55;
|
||||
await Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
if (Topmost == false)
|
||||
if (!Topmost)
|
||||
MarginFromEdge = -60;
|
||||
else
|
||||
ViewboxFloatingBar.Visibility = Visibility.Visible;
|
||||
@@ -1337,7 +1349,7 @@ namespace Ink_Canvas
|
||||
|
||||
pos.X = (screenWidth - floatingBarWidth) / 2;
|
||||
|
||||
if (PosXCaculatedWithTaskbarHeight == false)
|
||||
if (!PosXCaculatedWithTaskbarHeight)
|
||||
{
|
||||
// 如果任务栏高度为0(隐藏状态),则使用固定边距
|
||||
if (toolbarHeight == 0)
|
||||
@@ -1405,12 +1417,18 @@ namespace Ink_Canvas
|
||||
await Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
ViewboxFloatingBar.Margin = new Thickness(pos.X, pos.Y, -2000, -200);
|
||||
if (Topmost == false) ViewboxFloatingBar.Visibility = Visibility.Hidden;
|
||||
if (!Topmost) ViewboxFloatingBar.Visibility = Visibility.Hidden;
|
||||
});
|
||||
}
|
||||
|
||||
public async void PureViewboxFloatingBarMarginAnimationInDesktopMode()
|
||||
{
|
||||
// 新增:在白板模式下不执行浮动栏动画
|
||||
if (currentMode == 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
ViewboxFloatingBar.Visibility = Visibility.Visible;
|
||||
@@ -1487,6 +1505,12 @@ namespace Ink_Canvas
|
||||
|
||||
public async void PureViewboxFloatingBarMarginAnimationInPPTMode()
|
||||
{
|
||||
// 新增:在白板模式下不执行浮动栏动画
|
||||
if (currentMode == 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
ViewboxFloatingBar.Visibility = Visibility.Visible;
|
||||
@@ -2077,9 +2101,9 @@ namespace Ink_Canvas
|
||||
{
|
||||
highlighterColor = 100; // 黑色荧光笔
|
||||
}
|
||||
else if (color == Colors.Yellow || IsColorSimilar(color, Color.FromRgb(234, 179, 8), 15) ||
|
||||
IsColorSimilar(color, Color.FromRgb(250, 204, 21), 15) ||
|
||||
IsColorSimilar(color, Color.FromRgb(253, 224, 71), 15))
|
||||
else if (color == Colors.Yellow || IsColorSimilar(color, Color.FromRgb(234, 179, 8)) ||
|
||||
IsColorSimilar(color, Color.FromRgb(250, 204, 21)) ||
|
||||
IsColorSimilar(color, Color.FromRgb(253, 224, 71)))
|
||||
{
|
||||
highlighterColor = 103; // 黄色荧光笔
|
||||
}
|
||||
@@ -2094,12 +2118,12 @@ namespace Ink_Canvas
|
||||
{
|
||||
highlighterColor = 106; // 蓝色荧光笔
|
||||
}
|
||||
else if (color == Colors.Red || IsColorSimilar(color, Color.FromRgb(220, 38, 38), 15) ||
|
||||
IsColorSimilar(color, Color.FromRgb(239, 68, 68), 15))
|
||||
else if (color == Colors.Red || IsColorSimilar(color, Color.FromRgb(220, 38, 38)) ||
|
||||
IsColorSimilar(color, Color.FromRgb(239, 68, 68)))
|
||||
{
|
||||
highlighterColor = 102; // 红色荧光笔
|
||||
}
|
||||
else if (color == Colors.Green || IsColorSimilar(color, Color.FromRgb(22, 163, 74), 15))
|
||||
else if (color == Colors.Green || IsColorSimilar(color, Color.FromRgb(22, 163, 74)))
|
||||
{
|
||||
highlighterColor = 104; // 绿色荧光笔
|
||||
}
|
||||
@@ -2560,6 +2584,9 @@ namespace Ink_Canvas
|
||||
ClearStrokes(true);
|
||||
RestoreStrokes(true);
|
||||
|
||||
// 新增:在屏幕模式下恢复基础浮动栏的显示
|
||||
ViewboxFloatingBar.Visibility = Visibility.Visible;
|
||||
|
||||
if (BtnSwitchTheme.Content.ToString() == "浅色")
|
||||
{
|
||||
BtnSwitch.Content = "黑板";
|
||||
@@ -2598,6 +2625,9 @@ namespace Ink_Canvas
|
||||
// PPT墨迹和白板墨迹应该分别管理,不应该互相影响
|
||||
RestoreStrokes();
|
||||
|
||||
// 新增:在白板模式下隐藏基础浮动栏
|
||||
ViewboxFloatingBar.Visibility = Visibility.Collapsed;
|
||||
|
||||
BtnSwitch.Content = "屏幕";
|
||||
if (BtnSwitchTheme.Content.ToString() == "浅色")
|
||||
{
|
||||
@@ -2737,11 +2767,23 @@ namespace Ink_Canvas
|
||||
StackPanelCanvasControls.Visibility = Visibility.Collapsed;
|
||||
CheckEnableTwoFingerGestureBtnVisibility(false);
|
||||
HideSubPanels("cursor");
|
||||
|
||||
// 新增:在屏幕模式下显示基础浮动栏
|
||||
if (currentMode == 0)
|
||||
{
|
||||
ViewboxFloatingBar.Visibility = Visibility.Visible;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AnimationsHelper.ShowWithSlideFromLeftAndFade(StackPanelCanvasControls);
|
||||
CheckEnableTwoFingerGestureBtnVisibility(true);
|
||||
|
||||
// 新增:在批注模式下显示基础浮动栏
|
||||
if (currentMode == 0)
|
||||
{
|
||||
ViewboxFloatingBar.Visibility = Visibility.Visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3096,19 +3138,16 @@ namespace Ink_Canvas
|
||||
// 检查快捷调色盘是否显示及其实际宽度
|
||||
bool isQuickColorPaletteVisible = false;
|
||||
double quickColorPaletteWidth = 0;
|
||||
string quickColorPaletteMode = "none";
|
||||
|
||||
|
||||
if (QuickColorPalettePanel != null && QuickColorPalettePanel.Visibility == Visibility.Visible)
|
||||
{
|
||||
isQuickColorPaletteVisible = true;
|
||||
quickColorPaletteWidth = QuickColorPalettePanel.ActualWidth > 0 ? QuickColorPalettePanel.ActualWidth : 60;
|
||||
quickColorPaletteMode = "double";
|
||||
}
|
||||
else if (QuickColorPaletteSingleRowPanel != null && QuickColorPaletteSingleRowPanel.Visibility == Visibility.Visible)
|
||||
{
|
||||
isQuickColorPaletteVisible = true;
|
||||
quickColorPaletteWidth = QuickColorPaletteSingleRowPanel.ActualWidth > 0 ? QuickColorPaletteSingleRowPanel.ActualWidth : 120;
|
||||
quickColorPaletteMode = "single";
|
||||
}
|
||||
|
||||
// 获取实际按钮宽度,如果获取不到则使用默认值,同时考虑按钮的可见性
|
||||
@@ -3227,26 +3266,27 @@ namespace Ink_Canvas
|
||||
{
|
||||
return "select";
|
||||
}
|
||||
else if (inkCanvas.EditingMode == InkCanvasEditingMode.Ink)
|
||||
|
||||
if (inkCanvas.EditingMode == InkCanvasEditingMode.Ink)
|
||||
{
|
||||
// 检查是否是荧光笔模式
|
||||
if (drawingAttributes != null && drawingAttributes.IsHighlighter)
|
||||
{
|
||||
return "color";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "pen";
|
||||
}
|
||||
|
||||
return "pen";
|
||||
}
|
||||
else if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
|
||||
|
||||
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
|
||||
{
|
||||
// 检查是面积擦还是线擦
|
||||
if (Eraser_Icon != null && Eraser_Icon.Visibility == Visibility.Visible)
|
||||
{
|
||||
return "eraser";
|
||||
}
|
||||
else if (EraserByStrokes_Icon != null && EraserByStrokes_Icon.Visibility == Visibility.Visible)
|
||||
|
||||
if (EraserByStrokes_Icon != null && EraserByStrokes_Icon.Visibility == Visibility.Visible)
|
||||
{
|
||||
return "eraserByStrokes";
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
@@ -11,8 +10,14 @@ using System.Windows.Controls;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Threading;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Application = System.Windows.Application;
|
||||
using Color = System.Drawing.Color;
|
||||
using Cursors = System.Windows.Input.Cursors;
|
||||
using Image = System.Windows.Controls.Image;
|
||||
using PixelFormat = System.Drawing.Imaging.PixelFormat;
|
||||
using Point = System.Windows.Point;
|
||||
using Size = System.Drawing.Size;
|
||||
|
||||
namespace Ink_Canvas
|
||||
@@ -21,9 +26,9 @@ namespace Ink_Canvas
|
||||
public struct ScreenshotResult
|
||||
{
|
||||
public Rectangle Area;
|
||||
public List<System.Windows.Point> Path;
|
||||
public List<Point> Path;
|
||||
|
||||
public ScreenshotResult(Rectangle area, List<System.Windows.Point> path = null)
|
||||
public ScreenshotResult(Rectangle area, List<Point> path = null)
|
||||
{
|
||||
Area = area;
|
||||
Path = path;
|
||||
@@ -172,7 +177,7 @@ namespace Ink_Canvas
|
||||
var bitmapSource = ConvertBitmapToBitmapSource(bitmap);
|
||||
|
||||
// 创建WPF Image控件
|
||||
var image = new System.Windows.Controls.Image
|
||||
var image = new Image
|
||||
{
|
||||
Source = bitmapSource,
|
||||
Stretch = Stretch.Uniform
|
||||
@@ -202,7 +207,7 @@ namespace Ink_Canvas
|
||||
CenterAndScaleScreenshot(image);
|
||||
// 绑定事件处理器
|
||||
BindScreenshotEvents(image);
|
||||
}), System.Windows.Threading.DispatcherPriority.Loaded);
|
||||
}), DispatcherPriority.Loaded);
|
||||
};
|
||||
|
||||
// 添加到画布
|
||||
@@ -221,7 +226,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
|
||||
// 初始化截图的TransformGroup
|
||||
private void InitializeScreenshotTransform(System.Windows.Controls.Image image)
|
||||
private void InitializeScreenshotTransform(Image image)
|
||||
{
|
||||
var transformGroup = new TransformGroup();
|
||||
transformGroup.Children.Add(new ScaleTransform(1, 1));
|
||||
@@ -231,7 +236,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
|
||||
// 绑定截图事件处理器
|
||||
private void BindScreenshotEvents(System.Windows.Controls.Image image)
|
||||
private void BindScreenshotEvents(Image image)
|
||||
{
|
||||
// 鼠标事件
|
||||
image.MouseLeftButtonDown += Element_MouseLeftButtonDown;
|
||||
@@ -245,7 +250,7 @@ namespace Ink_Canvas
|
||||
image.ManipulationCompleted += Element_ManipulationCompleted;
|
||||
|
||||
// 设置光标
|
||||
image.Cursor = System.Windows.Input.Cursors.Hand;
|
||||
image.Cursor = Cursors.Hand;
|
||||
|
||||
// 禁用InkCanvas对截图的选择处理
|
||||
image.IsHitTestVisible = true;
|
||||
@@ -253,7 +258,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
|
||||
// 专门为截图优化的居中缩放方法
|
||||
private void CenterAndScaleScreenshot(System.Windows.Controls.Image image)
|
||||
private void CenterAndScaleScreenshot(Image image)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -270,8 +275,8 @@ namespace Ink_Canvas
|
||||
// 如果画布尺寸为0,使用窗口尺寸作为备选
|
||||
if (canvasWidth <= 0 || canvasHeight <= 0)
|
||||
{
|
||||
canvasWidth = this.ActualWidth;
|
||||
canvasHeight = this.ActualHeight;
|
||||
canvasWidth = ActualWidth;
|
||||
canvasHeight = ActualHeight;
|
||||
}
|
||||
|
||||
// 如果仍然为0,使用屏幕尺寸
|
||||
@@ -320,8 +325,12 @@ namespace Ink_Canvas
|
||||
InkCanvas.SetLeft(image, centerX);
|
||||
InkCanvas.SetTop(image, centerY);
|
||||
|
||||
// 清除任何现有的RenderTransform
|
||||
image.RenderTransform = Transform.Identity;
|
||||
// 这样可以保持滚轮缩放和拖动功能
|
||||
if (image.RenderTransform == null || image.RenderTransform == Transform.Identity)
|
||||
{
|
||||
// 只有在没有TransformGroup时才创建
|
||||
InitializeScreenshotTransform(image);
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile($"截图居中完成: 位置({centerX}, {centerY}), 尺寸({newWidth}x{newHeight})");
|
||||
}
|
||||
@@ -334,7 +343,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
|
||||
// 应用形状遮罩到截图
|
||||
private Bitmap ApplyShapeMask(Bitmap bitmap, List<System.Windows.Point> path, Rectangle area)
|
||||
private Bitmap ApplyShapeMask(Bitmap bitmap, List<Point> path, Rectangle area)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -356,7 +365,7 @@ namespace Ink_Canvas
|
||||
using (var resultGraphics = Graphics.FromImage(resultBitmap))
|
||||
{
|
||||
// 清除位图,设置为完全透明
|
||||
resultGraphics.Clear(System.Drawing.Color.Transparent);
|
||||
resultGraphics.Clear(Color.Transparent);
|
||||
|
||||
// 设置高质量渲染
|
||||
resultGraphics.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using Microsoft.Office.Core;
|
||||
using Microsoft.Office.Interop.PowerPoint;
|
||||
using System;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Cryptography;
|
||||
@@ -12,6 +8,10 @@ using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Threading;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using Microsoft.Office.Core;
|
||||
using Microsoft.Office.Interop.PowerPoint;
|
||||
using Application = System.Windows.Application;
|
||||
using File = System.IO.File;
|
||||
using MessageBox = System.Windows.MessageBox;
|
||||
@@ -76,15 +76,11 @@ namespace Ink_Canvas
|
||||
|
||||
#region PPT State Management
|
||||
private bool wasFloatingBarFoldedWhenEnterSlideShow;
|
||||
private static bool hasShownWpsForceCloseWarning = false;
|
||||
private bool isEnteredSlideShowEndEvent; //防止重复调用本函数导致墨迹保存失效
|
||||
private bool isPresentationHaveBlackSpace;
|
||||
private string pptName;
|
||||
private bool _isPptClickingBtnTurned;
|
||||
|
||||
// 长按翻页相关字段
|
||||
private DispatcherTimer _longPressTimer;
|
||||
private bool _isLongPressActive = false;
|
||||
private bool _isLongPressNext = true; // true为下一页,false为上一页
|
||||
private const int LongPressDelay = 15; // 长按延迟时间(毫秒)
|
||||
private const int LongPressInterval = 15; // 长按翻页间隔(毫秒)
|
||||
@@ -202,7 +198,6 @@ namespace Ink_Canvas
|
||||
if (!Settings.PowerPointSettings.EnablePPTButtonLongPressPageTurn) return;
|
||||
|
||||
_isLongPressNext = isNext;
|
||||
_isLongPressActive = false;
|
||||
_longPressTimer?.Start();
|
||||
}
|
||||
|
||||
@@ -212,7 +207,6 @@ namespace Ink_Canvas
|
||||
private void StopLongPressDetection()
|
||||
{
|
||||
_longPressTimer?.Stop();
|
||||
_isLongPressActive = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -222,7 +216,6 @@ namespace Ink_Canvas
|
||||
{
|
||||
if (!Settings.PowerPointSettings.EnablePPTButtonLongPressPageTurn) return;
|
||||
|
||||
_isLongPressActive = true;
|
||||
_longPressTimer.Interval = TimeSpan.FromMilliseconds(LongPressInterval);
|
||||
|
||||
// 执行翻页
|
||||
@@ -846,8 +839,6 @@ namespace Ink_Canvas
|
||||
{
|
||||
try
|
||||
{
|
||||
_isPptClickingBtnTurned = true;
|
||||
|
||||
// 保存当前页墨迹
|
||||
var currentSlide = _pptManager?.GetCurrentSlideNumber() ?? 0;
|
||||
if (currentSlide > 0)
|
||||
@@ -889,8 +880,6 @@ namespace Ink_Canvas
|
||||
{
|
||||
try
|
||||
{
|
||||
_isPptClickingBtnTurned = true;
|
||||
|
||||
// 保存当前页墨迹
|
||||
var currentSlide = _pptManager?.GetCurrentSlideNumber() ?? 0;
|
||||
if (currentSlide > 0)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
@@ -86,6 +86,17 @@ namespace Ink_Canvas
|
||||
// 只有当选择的页面与当前页面不同时才进行切换
|
||||
if (index + 1 != CurrentWhiteboardIndex)
|
||||
{
|
||||
// 隐藏图片选择工具栏
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
currentSelectedElement = null;
|
||||
}
|
||||
|
||||
SaveStrokes();
|
||||
ClearStrokes(true);
|
||||
CurrentWhiteboardIndex = index + 1;
|
||||
@@ -108,6 +119,17 @@ namespace Ink_Canvas
|
||||
// 只有当选择的页面与当前页面不同时才进行切换
|
||||
if (index + 1 != CurrentWhiteboardIndex)
|
||||
{
|
||||
// 隐藏图片选择工具栏
|
||||
if (currentSelectedElement != null)
|
||||
{
|
||||
// 保存当前编辑模式
|
||||
var previousEditingMode = inkCanvas.EditingMode;
|
||||
UnselectElement(currentSelectedElement);
|
||||
// 恢复编辑模式
|
||||
inkCanvas.EditingMode = previousEditingMode;
|
||||
currentSelectedElement = null;
|
||||
}
|
||||
|
||||
SaveStrokes();
|
||||
ClearStrokes(true);
|
||||
CurrentWhiteboardIndex = index + 1;
|
||||
|
||||
@@ -1,15 +1,22 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Newtonsoft.Json;
|
||||
using Color = System.Drawing.Color;
|
||||
using File = System.IO.File;
|
||||
using Image = System.Windows.Controls.Image;
|
||||
using OpenFileDialog = Microsoft.Win32.OpenFileDialog;
|
||||
|
||||
namespace Ink_Canvas
|
||||
@@ -150,7 +157,7 @@ namespace Ink_Canvas
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowNotification("墨迹保存失败");
|
||||
LogHelper.WriteLogToFile("墨迹保存失败 | " + ex.ToString(), LogHelper.LogType.Error);
|
||||
LogHelper.WriteLogToFile("墨迹保存失败 | " + ex, LogHelper.LogType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,7 +198,7 @@ namespace Ink_Canvas
|
||||
|
||||
// 保存元数据信息
|
||||
string metadataFile = Path.Combine(tempDir, "metadata.txt");
|
||||
using (var writer = new StreamWriter(metadataFile, false, System.Text.Encoding.UTF8))
|
||||
using (var writer = new StreamWriter(metadataFile, false, Encoding.UTF8))
|
||||
{
|
||||
writer.WriteLine($"保存时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
|
||||
writer.WriteLine($"总页数: {allPageStrokes.Count}");
|
||||
@@ -219,7 +226,7 @@ namespace Ink_Canvas
|
||||
File.Delete(zipFileName);
|
||||
|
||||
// 使用System.IO.Compression.FileSystem来创建ZIP
|
||||
System.IO.Compression.ZipFile.CreateFromDirectory(tempDir, zipFileName);
|
||||
ZipFile.CreateFromDirectory(tempDir, zipFileName);
|
||||
|
||||
if (newNotice) ShowNotification($"多页面墨迹成功保存至压缩包 {zipFileName}");
|
||||
}
|
||||
@@ -233,13 +240,13 @@ namespace Ink_Canvas
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"清理临时目录失败: {ex.ToString()}", LogHelper.LogType.Warning);
|
||||
LogHelper.WriteLogToFile($"清理临时目录失败: {ex}", LogHelper.LogType.Warning);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"保存多页面墨迹压缩包失败: {ex.ToString()}", LogHelper.LogType.Error);
|
||||
LogHelper.WriteLogToFile($"保存多页面墨迹压缩包失败: {ex}", LogHelper.LogType.Error);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@@ -250,16 +257,16 @@ namespace Ink_Canvas
|
||||
private void SaveSinglePageStrokesAsImage(string savePathWithName, bool newNotice)
|
||||
{
|
||||
// 全页面保存模式 - 保存整个墨迹页面的图像
|
||||
var bitmap = new System.Drawing.Bitmap(
|
||||
(int)System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
|
||||
(int)System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);
|
||||
var bitmap = new Bitmap(
|
||||
Screen.PrimaryScreen.Bounds.Width,
|
||||
Screen.PrimaryScreen.Bounds.Height);
|
||||
|
||||
using (var g = System.Drawing.Graphics.FromImage(bitmap))
|
||||
using (var g = Graphics.FromImage(bitmap))
|
||||
{
|
||||
// 创建黑色或透明背景
|
||||
System.Drawing.Color bgColor = Settings.Canvas.UsingWhiteboard
|
||||
? System.Drawing.Color.White
|
||||
: System.Drawing.Color.FromArgb(22, 41, 36); // 黑板背景色
|
||||
Color bgColor = Settings.Canvas.UsingWhiteboard
|
||||
? Color.White
|
||||
: Color.FromArgb(22, 41, 36); // 黑板背景色
|
||||
g.Clear(bgColor);
|
||||
|
||||
// 将InkCanvas墨迹渲染到Visual
|
||||
@@ -287,7 +294,7 @@ namespace Ink_Canvas
|
||||
{
|
||||
encoder.Save(ms);
|
||||
ms.Seek(0, SeekOrigin.Begin);
|
||||
var imgBitmap = new System.Drawing.Bitmap(ms);
|
||||
var imgBitmap = new Bitmap(ms);
|
||||
|
||||
// 将生成的墨迹图像绘制到屏幕截图上
|
||||
// 居中绘制,确保墨迹位于屏幕中央
|
||||
@@ -297,7 +304,7 @@ namespace Ink_Canvas
|
||||
|
||||
// 保存为PNG
|
||||
string imagePathWithName = Path.ChangeExtension(savePathWithName, "png");
|
||||
bitmap.Save(imagePathWithName, System.Drawing.Imaging.ImageFormat.Png);
|
||||
bitmap.Save(imagePathWithName, ImageFormat.Png);
|
||||
|
||||
// 仍然保存墨迹文件以兼容旧版本
|
||||
var fs = new FileStream(savePathWithName, FileMode.Create);
|
||||
@@ -337,7 +344,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"保存页面图像失败: {ex.ToString()}", LogHelper.LogType.Error);
|
||||
LogHelper.WriteLogToFile($"保存页面图像失败: {ex}", LogHelper.LogType.Error);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@@ -376,7 +383,7 @@ namespace Ink_Canvas
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowNotification("墨迹打开失败");
|
||||
LogHelper.WriteLogToFile($"墨迹打开失败: {ex.ToString()}", LogHelper.LogType.Error);
|
||||
LogHelper.WriteLogToFile($"墨迹打开失败: {ex}", LogHelper.LogType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,7 +401,7 @@ namespace Ink_Canvas
|
||||
try
|
||||
{
|
||||
// 解压ZIP文件
|
||||
System.IO.Compression.ZipFile.ExtractToDirectory(zipFilePath, tempDir);
|
||||
ZipFile.ExtractToDirectory(zipFilePath, tempDir);
|
||||
|
||||
// 读取元数据文件
|
||||
string metadataFile = Path.Combine(tempDir, "metadata.txt");
|
||||
@@ -447,13 +454,13 @@ namespace Ink_Canvas
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"清理临时目录失败: {ex.ToString()}", LogHelper.LogType.Warning);
|
||||
LogHelper.WriteLogToFile($"清理临时目录失败: {ex}", LogHelper.LogType.Warning);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"打开ICC压缩包失败: {ex.ToString()}", LogHelper.LogType.Error);
|
||||
LogHelper.WriteLogToFile($"打开ICC压缩包失败: {ex}", LogHelper.LogType.Error);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@@ -465,7 +472,7 @@ namespace Ink_Canvas
|
||||
{
|
||||
var metadata = new Dictionary<string, string>();
|
||||
|
||||
using (var reader = new StreamReader(metadataPath, System.Text.Encoding.UTF8))
|
||||
using (var reader = new StreamReader(metadataPath, Encoding.UTF8))
|
||||
{
|
||||
string line;
|
||||
while ((line = reader.ReadLine()) != null)
|
||||
@@ -556,7 +563,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"恢复PPT墨迹失败: {ex.ToString()}", LogHelper.LogType.Error);
|
||||
LogHelper.WriteLogToFile($"恢复PPT墨迹失败: {ex}", LogHelper.LogType.Error);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@@ -609,7 +616,7 @@ namespace Ink_Canvas
|
||||
{
|
||||
// 创建历史记录
|
||||
var history = new TimeMachineHistory(strokes, TimeMachineHistoryType.UserInput, false);
|
||||
TimeMachineHistories[pageNumber] = new TimeMachineHistory[] { history };
|
||||
TimeMachineHistories[pageNumber] = new[] { history };
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -628,7 +635,7 @@ namespace Ink_Canvas
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"恢复白板墨迹失败: {ex.ToString()}", LogHelper.LogType.Error);
|
||||
LogHelper.WriteLogToFile($"恢复白板墨迹失败: {ex}", LogHelper.LogType.Error);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
@@ -42,10 +43,10 @@ namespace Ink_Canvas
|
||||
using (var memoryGraphics = Graphics.FromImage(bitmap))
|
||||
{
|
||||
// 设置高质量渲染
|
||||
memoryGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
|
||||
memoryGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
||||
memoryGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
||||
memoryGraphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
|
||||
memoryGraphics.CompositingQuality = CompositingQuality.HighQuality;
|
||||
memoryGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||
memoryGraphics.SmoothingMode = SmoothingMode.HighQuality;
|
||||
memoryGraphics.CompositingMode = CompositingMode.SourceOver;
|
||||
|
||||
memoryGraphics.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, CopyPixelOperation.SourceCopy);
|
||||
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Threading;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Point = System.Windows.Point;
|
||||
using System.Linq;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
@@ -310,7 +308,7 @@ namespace Ink_Canvas
|
||||
|
||||
// 检查是否有图片元素被选中
|
||||
var selectedElements = inkCanvas.GetSelectedElements();
|
||||
bool hasImageElement = selectedElements.Any(element => element is System.Windows.Controls.Image);
|
||||
bool hasImageElement = selectedElements.Any(element => element is Image);
|
||||
|
||||
// 如果有图片元素被选中,不显示选择框
|
||||
if (hasImageElement)
|
||||
@@ -553,11 +551,9 @@ namespace Ink_Canvas
|
||||
return new Rect(left, top, width, height);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 没有变换时直接使用位置和大小
|
||||
return new Rect(left, top, width, height);
|
||||
}
|
||||
|
||||
// 没有变换时直接使用位置和大小
|
||||
return new Rect(left, top, width, height);
|
||||
}
|
||||
|
||||
return new Rect(0, 0, 0, 0);
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Newtonsoft.Json;
|
||||
using OSVersionExtension;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
@@ -13,6 +9,11 @@ using System.Windows.Input;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Threading;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Newtonsoft.Json;
|
||||
using OSVersionExtension;
|
||||
using Application = System.Windows.Application;
|
||||
using CheckBox = System.Windows.Controls.CheckBox;
|
||||
using ComboBox = System.Windows.Controls.ComboBox;
|
||||
@@ -196,11 +197,14 @@ namespace Ink_Canvas
|
||||
val > 0.5 && val < 1.25 ? val : val <= 0.5 ? 0.5 : val >= 1.25 ? 1.25 : 1;
|
||||
ViewboxFloatingBarScaleTransform.ScaleY =
|
||||
val > 0.5 && val < 1.25 ? val : val <= 0.5 ? 0.5 : val >= 1.25 ? 1.25 : 1;
|
||||
// auto align
|
||||
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
|
||||
ViewboxFloatingBarMarginAnimation(60);
|
||||
else
|
||||
ViewboxFloatingBarMarginAnimation(100, true);
|
||||
// auto align - 新增:只在屏幕模式下重新计算浮动栏位置
|
||||
if (currentMode == 0)
|
||||
{
|
||||
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
|
||||
ViewboxFloatingBarMarginAnimation(60);
|
||||
else
|
||||
ViewboxFloatingBarMarginAnimation(100, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void ViewboxFloatingBarOpacityValueSlider_ValueChanged(object sender, RoutedEventArgs e)
|
||||
@@ -2686,14 +2690,14 @@ namespace Ink_Canvas
|
||||
await Task.Delay(100);
|
||||
|
||||
// 获取当前选中的模式并重新设置高光位置
|
||||
string currentMode = GetCurrentSelectedMode();
|
||||
if (!string.IsNullOrEmpty(currentMode))
|
||||
string selectedToolMode = GetCurrentSelectedMode();
|
||||
if (!string.IsNullOrEmpty(selectedToolMode))
|
||||
{
|
||||
SetFloatingBarHighlightPosition(currentMode);
|
||||
SetFloatingBarHighlightPosition(selectedToolMode);
|
||||
}
|
||||
|
||||
// 重新计算浮动栏位置,因为按钮可见性变化会影响浮动栏宽度
|
||||
if (!isFloatingBarFolded)
|
||||
if (!isFloatingBarFolded && currentMode == 0) // 新增:只在屏幕模式下重新计算浮动栏位置
|
||||
{
|
||||
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
|
||||
{
|
||||
@@ -2709,7 +2713,7 @@ namespace Ink_Canvas
|
||||
{
|
||||
LogHelper.WriteLogToFile($"重新计算高光位置和浮动栏位置失败: {ex.Message}", LogHelper.LogType.Error);
|
||||
}
|
||||
}), System.Windows.Threading.DispatcherPriority.Loaded);
|
||||
}), DispatcherPriority.Loaded);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -2742,13 +2746,13 @@ namespace Ink_Canvas
|
||||
|
||||
private void HyperlinkSourceToPresentRepository_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Process.Start("https://bgithub.xyz/ChangSakura/Ink-Canvas");
|
||||
Process.Start("https://github.com/ChangSakura/Ink-Canvas");
|
||||
HideSubPanels();
|
||||
}
|
||||
|
||||
private void HyperlinkSourceToOringinalRepository_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Process.Start("https://bgithub.xyz/WXRIW/Ink-Canvas");
|
||||
Process.Start("https://github.com/WXRIW/Ink-Canvas");
|
||||
HideSubPanels();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Newtonsoft.Json;
|
||||
using OSVersionExtension;
|
||||
using System;
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
@@ -10,6 +6,10 @@ using System.Windows.Ink;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Newtonsoft.Json;
|
||||
using OSVersionExtension;
|
||||
using File = System.IO.File;
|
||||
using OperatingSystem = OSVersionExtension.OperatingSystem;
|
||||
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
@@ -10,6 +8,8 @@ using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using MessageBox = System.Windows.MessageBox;
|
||||
using Point = System.Windows.Point;
|
||||
|
||||
@@ -74,9 +74,9 @@ namespace Ink_Canvas
|
||||
ToggleSwitchDrawShapeBorderAutoHide.IsOn = !ToggleSwitchDrawShapeBorderAutoHide.IsOn;
|
||||
|
||||
if (ToggleSwitchDrawShapeBorderAutoHide.IsOn)
|
||||
((SymbolIcon)sender).Symbol = Symbol.Pin;
|
||||
((FontIcon)sender).Glyph = "";
|
||||
else
|
||||
((SymbolIcon)sender).Symbol = Symbol.UnPin;
|
||||
((FontIcon)sender).Glyph = "";
|
||||
}
|
||||
|
||||
private object lastMouseDownSender;
|
||||
@@ -499,20 +499,18 @@ namespace Ink_Canvas
|
||||
catch { }
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
// 其他情况正常删除临时笔画
|
||||
try
|
||||
{
|
||||
// 其他情况正常删除临时笔画
|
||||
try
|
||||
{
|
||||
inkCanvas.Strokes.Remove(lastTempStroke);
|
||||
inkCanvas.Strokes.Remove(lastTempStrokeCollection);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Trace.WriteLine("lastTempStrokeCollection failed.");
|
||||
}
|
||||
return;
|
||||
inkCanvas.Strokes.Remove(lastTempStroke);
|
||||
inkCanvas.Strokes.Remove(lastTempStrokeCollection);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Trace.WriteLine("lastTempStrokeCollection failed.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// 修复:双曲线绘制时,第二笔应该基于第一笔的起点,而不是触摸实时位置
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
@@ -9,6 +8,7 @@ using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Point = System.Windows.Point;
|
||||
|
||||
namespace Ink_Canvas
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
@@ -7,6 +6,7 @@ using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
@@ -12,6 +11,7 @@ using System.Threading.Tasks;
|
||||
using System.Timers;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -8,6 +7,8 @@ using System.Windows.Controls;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Threading;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Point = System.Windows.Point;
|
||||
|
||||
namespace Ink_Canvas
|
||||
@@ -162,13 +163,13 @@ namespace Ink_Canvas
|
||||
return;
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile($"MainWindow_StylusDown 被调用,笔尾状态: {e.StylusDevice.Inverted}, 当前 drawingShapeMode: {drawingShapeMode}, 当前 EditingMode: {inkCanvas.EditingMode}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"MainWindow_StylusDown 被调用,笔尾状态: {e.StylusDevice.Inverted}, 当前 drawingShapeMode: {drawingShapeMode}, 当前 EditingMode: {inkCanvas.EditingMode}");
|
||||
|
||||
// 新增:根据是否为笔尾自动切换橡皮擦/画笔模式
|
||||
if (e.StylusDevice.Inverted)
|
||||
{
|
||||
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
||||
LogHelper.WriteLogToFile("检测到笔尾,设置 EditingMode 为 EraseByPoint", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("检测到笔尾,设置 EditingMode 为 EraseByPoint");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -177,18 +178,18 @@ namespace Ink_Canvas
|
||||
{
|
||||
// 确保几何绘制模式下不切换到Ink模式,避免触摸轨迹被收集
|
||||
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||
LogHelper.WriteLogToFile("几何绘制模式,设置 EditingMode 为 None", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("几何绘制模式,设置 EditingMode 为 None");
|
||||
return;
|
||||
}
|
||||
// 修复:保持当前的线擦模式,不要强制切换到Ink模式
|
||||
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByStroke)
|
||||
{
|
||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||
LogHelper.WriteLogToFile("设置 EditingMode 为 Ink", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("设置 EditingMode 为 Ink");
|
||||
}
|
||||
else
|
||||
{
|
||||
LogHelper.WriteLogToFile("保持当前线擦模式", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("保持当前线擦模式");
|
||||
}
|
||||
}
|
||||
SetCursorBasedOnEditingMode(inkCanvas);
|
||||
@@ -230,14 +231,14 @@ namespace Ink_Canvas
|
||||
{
|
||||
try
|
||||
{
|
||||
LogHelper.WriteLogToFile($"MainWindow_StylusUp 被调用,EditingMode: {inkCanvas.EditingMode}, EnableInkFade: {Settings.Canvas.EnableInkFade}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"MainWindow_StylusUp 被调用,EditingMode: {inkCanvas.EditingMode}, EnableInkFade: {Settings.Canvas.EnableInkFade}");
|
||||
|
||||
var stroke = GetStrokeVisual(e.StylusDevice.Id).Stroke;
|
||||
LogHelper.WriteLogToFile($"获取到墨迹,StylusPoints数量: {stroke.StylusPoints.Count}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"获取到墨迹,StylusPoints数量: {stroke.StylusPoints.Count}");
|
||||
|
||||
// 正常模式:添加到画布并参与墨迹纠正
|
||||
// 墨迹渐隐功能现在在 StrokeCollected 事件中统一处理所有输入方式
|
||||
LogHelper.WriteLogToFile("StylusUp: 添加墨迹到画布", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("StylusUp: 添加墨迹到画布");
|
||||
|
||||
inkCanvas.Strokes.Add(stroke);
|
||||
await Task.Delay(5); // 避免渲染墨迹完成前预览墨迹被删除导致墨迹闪烁
|
||||
@@ -340,7 +341,7 @@ namespace Ink_Canvas
|
||||
#endregion
|
||||
|
||||
|
||||
private int lastTouchDownTime = 0, lastTouchUpTime = 0;
|
||||
|
||||
|
||||
private Point iniP = new Point(0, 0);
|
||||
|
||||
@@ -398,10 +399,10 @@ namespace Ink_Canvas
|
||||
private InkCanvasEditingMode palmEraserLastEditingMode = InkCanvasEditingMode.Ink;
|
||||
private bool palmEraserLastIsHighlighter;
|
||||
private bool palmEraserWasEnabledBeforeMultiTouch;
|
||||
private bool palmEraserTouchDownHandled = false; // 新增:标记手掌擦触摸按下是否已处理
|
||||
private bool palmEraserTouchDownHandled; // 新增:标记手掌擦触摸按下是否已处理
|
||||
private DateTime palmEraserActivationTime; // 新增:记录手掌擦激活时间
|
||||
private const int PALM_ERASER_TIMEOUT_MS = 3000; // 修改:减少手掌擦超时时间(3秒)
|
||||
private System.Windows.Threading.DispatcherTimer palmEraserRecoveryTimer; // 新增:手掌擦恢复定时器
|
||||
private DispatcherTimer palmEraserRecoveryTimer; // 新增:手掌擦恢复定时器
|
||||
private HashSet<int> palmEraserTouchIds = new HashSet<int>(); // 新增:记录参与手掌擦的触摸点ID
|
||||
|
||||
private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e)
|
||||
@@ -528,7 +529,7 @@ namespace Ink_Canvas
|
||||
StartPalmEraserRecoveryTimer();
|
||||
|
||||
// 记录日志
|
||||
LogHelper.WriteLogToFile($"Palm eraser activated - Sensitivity: {Settings.Canvas.PalmEraserSensitivity}, Touch bounds: {bounds.Width}x{bounds.Height}, Aspect ratio: {aspectRatio:F2}, Touch points: {dec.Count}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"Palm eraser activated - Sensitivity: {Settings.Canvas.PalmEraserSensitivity}, Touch bounds: {bounds.Width}x{bounds.Height}, Aspect ratio: {aspectRatio:F2}, Touch points: {dec.Count}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -623,7 +624,7 @@ namespace Ink_Canvas
|
||||
break;
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile($"Palm eraser recovered to mode: {palmEraserLastEditingMode}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"Palm eraser recovered to mode: {palmEraserLastEditingMode}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -648,7 +649,7 @@ namespace Ink_Canvas
|
||||
ViewboxFloatingBar.IsHitTestVisible = true;
|
||||
BlackboardUIGridForInkReplay.IsHitTestVisible = true;
|
||||
|
||||
LogHelper.WriteLogToFile("Palm eraser state reset completed", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("Palm eraser state reset completed");
|
||||
}
|
||||
|
||||
// 新增:超时检测 - 如果手掌擦激活时间过长,强制重置状态
|
||||
@@ -697,7 +698,7 @@ namespace Ink_Canvas
|
||||
// 停止恢复定时器
|
||||
StopPalmEraserRecoveryTimer();
|
||||
|
||||
LogHelper.WriteLogToFile("Palm eraser timeout recovery completed", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("Palm eraser timeout recovery completed");
|
||||
}
|
||||
}
|
||||
// 修复:几何绘制模式下,触摸抬手时应该正确处理,而不是简单模拟鼠标事件
|
||||
@@ -983,7 +984,7 @@ namespace Ink_Canvas
|
||||
{
|
||||
if (palmEraserRecoveryTimer == null)
|
||||
{
|
||||
palmEraserRecoveryTimer = new System.Windows.Threading.DispatcherTimer();
|
||||
palmEraserRecoveryTimer = new DispatcherTimer();
|
||||
palmEraserRecoveryTimer.Interval = TimeSpan.FromMilliseconds(1000); // 每秒检查一次
|
||||
palmEraserRecoveryTimer.Tick += PalmEraserRecoveryTimer_Tick;
|
||||
}
|
||||
@@ -1033,7 +1034,7 @@ namespace Ink_Canvas
|
||||
break;
|
||||
}
|
||||
|
||||
LogHelper.WriteLogToFile($"Palm eraser timer recovery to mode: {palmEraserLastEditingMode}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"Palm eraser timer recovery to mode: {palmEraserLastEditingMode}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -1055,7 +1056,7 @@ namespace Ink_Canvas
|
||||
// 停止定时器
|
||||
StopPalmEraserRecoveryTimer();
|
||||
|
||||
LogHelper.WriteLogToFile("Palm eraser timer recovery completed", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("Palm eraser timer recovery completed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Interop;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Application = System.Windows.Application;
|
||||
using ContextMenu = System.Windows.Controls.ContextMenu;
|
||||
using MenuItem = System.Windows.Controls.MenuItem;
|
||||
|
||||
@@ -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.8.4")]
|
||||
[assembly: AssemblyFileVersion("1.7.8.4")]
|
||||
[assembly: AssemblyVersion("1.7.9.0")]
|
||||
[assembly: AssemblyFileVersion("1.7.9.0")]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
@@ -93,11 +93,11 @@ namespace Ink_Canvas
|
||||
[JsonProperty("clearCanvasAlsoClearImages")]
|
||||
public bool ClearCanvasAlsoClearImages { get; set; } = true;
|
||||
[JsonProperty("showCircleCenter")]
|
||||
public bool ShowCircleCenter { get; set; } = false;
|
||||
public bool ShowCircleCenter { get; set; }
|
||||
|
||||
// 墨迹渐隐功能设置
|
||||
[JsonProperty("enableInkFade")]
|
||||
public bool EnableInkFade { get; set; } = false; // 是否启用墨迹渐隐功能
|
||||
public bool EnableInkFade { get; set; } // 是否启用墨迹渐隐功能
|
||||
[JsonProperty("inkFadeTime")]
|
||||
public int InkFadeTime { get; set; } = 3000; // 墨迹渐隐时间(毫秒)
|
||||
|
||||
@@ -152,7 +152,7 @@ namespace Ink_Canvas
|
||||
[JsonProperty("skippedVersion")]
|
||||
public string SkippedVersion { get; set; } = "";
|
||||
[JsonProperty("isEnableNibMode")]
|
||||
public bool IsEnableNibMode { get; set; } = false;
|
||||
public bool IsEnableNibMode { get; set; }
|
||||
[JsonProperty("isFoldAtStartup")]
|
||||
public bool IsFoldAtStartup { get; set; }
|
||||
[JsonProperty("crashAction")]
|
||||
@@ -225,10 +225,10 @@ namespace Ink_Canvas
|
||||
public bool IsShowClearAndMouseButton { get; set; } = true;
|
||||
|
||||
[JsonProperty("eraserDisplayOption")]
|
||||
public int EraserDisplayOption { get; set; } = 0;
|
||||
public int EraserDisplayOption { get; set; }
|
||||
|
||||
[JsonProperty("isShowQuickColorPalette")]
|
||||
public bool IsShowQuickColorPalette { get; set; } = false;
|
||||
public bool IsShowQuickColorPalette { get; set; }
|
||||
|
||||
[JsonProperty("quickColorPaletteDisplayMode")]
|
||||
public int QuickColorPaletteDisplayMode { get; set; } = 1;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -179,12 +179,12 @@
|
||||
<Grid>
|
||||
<Border x:Name="BtnStart" MouseUp="BtnStart_MouseUp" Background="#0066BF" Height="20" Width="20" CornerRadius="100">
|
||||
<Viewbox Margin="5">
|
||||
<ui:SymbolIcon Name="SymbolIconStart" Symbol="Play" Foreground="White"/>
|
||||
<ui:FontIcon Name="FontIconStart" Glyph="" Foreground="White"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
<Border x:Name="BtnStartCover" Visibility="Collapsed" Background="#BFBFBF" Height="20" Width="20" CornerRadius="100">
|
||||
<Viewbox Margin="5">
|
||||
<ui:SymbolIcon Symbol="{Binding ElementName=SymbolIconStart, Path=Symbol}" Foreground="White"/>
|
||||
<ui:FontIcon Glyph="{Binding ElementName=FontIconStart, Path=Glyph}" Foreground="White"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
</Grid>
|
||||
@@ -194,12 +194,12 @@
|
||||
<DropShadowEffect Direction="0" ShadowDepth="0" Opacity="0.15" BlurRadius="3"/>
|
||||
</Border.Effect>
|
||||
<Viewbox Margin="5.5">
|
||||
<ui:SymbolIcon Symbol="Refresh" Foreground="Black"/>
|
||||
<ui:FontIcon Glyph="" Foreground="Black"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
<Border x:Name="BtnResetCover" Background="#F3F5F9" Height="20" Width="20" CornerRadius="100">
|
||||
<Viewbox Margin="5.5">
|
||||
<ui:SymbolIcon Symbol="Refresh" Foreground="#9D9D9E"/>
|
||||
<ui:FontIcon Glyph="" Foreground="#9D9D9E"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
</Grid>
|
||||
@@ -215,7 +215,7 @@
|
||||
<DropShadowEffect Direction="0" ShadowDepth="0" Opacity="0.1" BlurRadius="3"/>
|
||||
</Border.Effect>
|
||||
<Viewbox Margin="5.5">
|
||||
<ui:SymbolIcon Name="SymbolIconMinimal" Symbol="HideBcc" Foreground="Black"/>
|
||||
<ui:FontIcon Name="FontIconMinimal" Glyph="" Foreground="Black"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
<Border x:Name="BtnFullscreen" MouseUp="BtnFullscreen_MouseUp" HorizontalAlignment="Right" VerticalAlignment="Bottom"
|
||||
@@ -225,7 +225,7 @@
|
||||
<DropShadowEffect Direction="0" ShadowDepth="0" Opacity="0.1" BlurRadius="3"/>
|
||||
</Border.Effect>
|
||||
<Viewbox Margin="5.5">
|
||||
<ui:SymbolIcon Name="SymbolIconFullscreen" Symbol="FullScreen" Foreground="Black"/>
|
||||
<ui:FontIcon Name="FontIconFullscreen" Glyph="" Foreground="Black"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
<Border x:Name="BtnClose" MouseUp="BtnClose_MouseUp" HorizontalAlignment="Right" VerticalAlignment="Bottom"
|
||||
@@ -235,7 +235,7 @@
|
||||
<DropShadowEffect Direction="0" ShadowDepth="0" Opacity="0.1" BlurRadius="3"/>
|
||||
</Border.Effect>
|
||||
<Viewbox Margin="5.5">
|
||||
<ui:SymbolIcon Symbol="Clear" Foreground="White"/>
|
||||
<ui:FontIcon Glyph="" Foreground="White"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
</ui:SimpleStackPanel>
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Media;
|
||||
using System.Timers;
|
||||
@@ -9,6 +7,7 @@ using System.Windows.Forms;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Application = System.Windows.Application;
|
||||
using MouseEventArgs = System.Windows.Input.MouseEventArgs;
|
||||
using Timer = System.Timers.Timer;
|
||||
@@ -57,7 +56,7 @@ namespace Ink_Canvas
|
||||
TextBlockSecond.Text = "00";
|
||||
timer.Stop();
|
||||
isTimerRunning = false;
|
||||
SymbolIconStart.Symbol = Symbol.Play;
|
||||
FontIconStart.Glyph = "";
|
||||
BtnStartCover.Visibility = Visibility.Visible;
|
||||
TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F"));
|
||||
BorderStopTime.Visibility = Visibility.Collapsed;
|
||||
@@ -92,7 +91,7 @@ namespace Ink_Canvas
|
||||
private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (isTimerRunning) return;
|
||||
if (ProcessBarTime.Visibility == Visibility.Visible && isTimerRunning == false)
|
||||
if (ProcessBarTime.Visibility == Visibility.Visible && !isTimerRunning)
|
||||
{
|
||||
ProcessBarTime.Visibility = Visibility.Collapsed;
|
||||
GridAdjustHour.Visibility = Visibility.Visible;
|
||||
@@ -208,12 +207,12 @@ namespace Ink_Canvas
|
||||
if (WindowState == WindowState.Normal)
|
||||
{
|
||||
WindowState = WindowState.Maximized;
|
||||
SymbolIconFullscreen.Symbol = Symbol.BackToWindow;
|
||||
FontIconFullscreen.Glyph = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
WindowState = WindowState.Normal;
|
||||
SymbolIconFullscreen.Symbol = Symbol.FullScreen;
|
||||
FontIconFullscreen.Glyph = "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -238,7 +237,7 @@ namespace Ink_Canvas
|
||||
BtnStartCover.Visibility = Visibility.Collapsed;
|
||||
BorderStopTime.Visibility = Visibility.Collapsed;
|
||||
TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F"));
|
||||
SymbolIconStart.Symbol = Symbol.Play;
|
||||
FontIconStart.Glyph = "";
|
||||
isTimerRunning = false;
|
||||
timer.Stop();
|
||||
isPaused = false;
|
||||
@@ -288,7 +287,7 @@ namespace Ink_Canvas
|
||||
startTime += DateTime.Now - pauseTime;
|
||||
ProcessBarTime.IsPaused = false;
|
||||
TextBlockHour.Foreground = Brushes.Black;
|
||||
SymbolIconStart.Symbol = Symbol.Pause;
|
||||
FontIconStart.Glyph = "";
|
||||
isPaused = false;
|
||||
timer.Start();
|
||||
UpdateStopTime();
|
||||
@@ -300,7 +299,7 @@ namespace Ink_Canvas
|
||||
pauseTime = DateTime.Now;
|
||||
ProcessBarTime.IsPaused = true;
|
||||
TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F"));
|
||||
SymbolIconStart.Symbol = Symbol.Play;
|
||||
FontIconStart.Glyph = "";
|
||||
BorderStopTime.Visibility = Visibility.Collapsed;
|
||||
isPaused = true;
|
||||
timer.Stop();
|
||||
@@ -312,7 +311,7 @@ namespace Ink_Canvas
|
||||
totalSeconds = ((hour * 60) + minute) * 60 + second;
|
||||
ProcessBarTime.IsPaused = false;
|
||||
TextBlockHour.Foreground = Brushes.Black;
|
||||
SymbolIconStart.Symbol = Symbol.Pause;
|
||||
FontIconStart.Glyph = "";
|
||||
BtnResetCover.Visibility = Visibility.Collapsed;
|
||||
|
||||
if (totalSeconds <= 10)
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using MdXaml;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -13,6 +10,9 @@ using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using MdXaml;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
@@ -8,6 +7,8 @@ using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
// Added for OrderByDescending
|
||||
|
||||
namespace Ink_Canvas
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Ink_Canvas.Windows
|
||||
{
|
||||
@@ -79,20 +80,20 @@ namespace Ink_Canvas.Windows
|
||||
if (_currentKey == Key.None)
|
||||
{
|
||||
CurrentHotkeyTextBlock.Text = "未设置";
|
||||
CurrentHotkeyTextBlock.Foreground = System.Windows.Media.Brushes.Gray;
|
||||
CurrentHotkeyTextBlock.Foreground = Brushes.Gray;
|
||||
}
|
||||
else
|
||||
{
|
||||
var modifiersText = _currentModifiers == ModifierKeys.None ? "" : $"{_currentModifiers}+";
|
||||
CurrentHotkeyTextBlock.Text = $"{modifiersText}{_currentKey}";
|
||||
CurrentHotkeyTextBlock.Foreground = System.Windows.Media.Brushes.Black;
|
||||
CurrentHotkeyTextBlock.Foreground = Brushes.Black;
|
||||
}
|
||||
}
|
||||
|
||||
private void StartHotkeyCapture()
|
||||
{
|
||||
BtnSetHotkey.Content = "请按键...";
|
||||
BtnSetHotkey.Background = System.Windows.Media.Brushes.Orange;
|
||||
BtnSetHotkey.Background = Brushes.Orange;
|
||||
|
||||
// 设置焦点以捕获键盘事件
|
||||
Focus();
|
||||
@@ -105,7 +106,7 @@ namespace Ink_Canvas.Windows
|
||||
private void StopHotkeyCapture()
|
||||
{
|
||||
BtnSetHotkey.Content = "设置";
|
||||
BtnSetHotkey.Background = System.Windows.Media.Brushes.DodgerBlue;
|
||||
BtnSetHotkey.Background = Brushes.DodgerBlue;
|
||||
|
||||
// 移除键盘事件处理器
|
||||
KeyDown -= HotkeyItem_KeyDown;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
@@ -57,7 +59,7 @@ namespace Ink_Canvas.Windows
|
||||
{
|
||||
try
|
||||
{
|
||||
LogHelper.WriteLogToFile("开始初始化快捷键项", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("开始初始化快捷键项");
|
||||
|
||||
// 初始化快捷键项并设置HotkeyName
|
||||
_hotkeyItems["Undo"] = UndoHotkey;
|
||||
@@ -114,7 +116,7 @@ namespace Ink_Canvas.Windows
|
||||
_hotkeyItems["Exit"] = ExitHotkey;
|
||||
ExitHotkey.HotkeyName = "Exit";
|
||||
|
||||
LogHelper.WriteLogToFile($"成功初始化 {_hotkeyItems.Count} 个快捷键项", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"成功初始化 {_hotkeyItems.Count} 个快捷键项");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -128,7 +130,7 @@ namespace Ink_Canvas.Windows
|
||||
{
|
||||
// 首先尝试从配置文件获取快捷键信息
|
||||
var configHotkeys = _hotkeyManager.GetHotkeysFromConfigFile();
|
||||
LogHelper.WriteLogToFile($"配置文件中的快捷键数量: {configHotkeys.Count}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"配置文件中的快捷键数量: {configHotkeys.Count}");
|
||||
|
||||
// 显示配置文件中的快捷键
|
||||
foreach (var hotkey in configHotkeys)
|
||||
@@ -136,7 +138,7 @@ namespace Ink_Canvas.Windows
|
||||
if (_hotkeyItems.TryGetValue(hotkey.Name, out var hotkeyItem))
|
||||
{
|
||||
hotkeyItem.SetCurrentHotkey(hotkey.Key, hotkey.Modifiers);
|
||||
LogHelper.WriteLogToFile($"从配置文件设置快捷键项: {hotkey.Name} -> {hotkey.Modifiers}+{hotkey.Key}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"从配置文件设置快捷键项: {hotkey.Name} -> {hotkey.Modifiers}+{hotkey.Key}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,7 +150,7 @@ namespace Ink_Canvas.Windows
|
||||
{
|
||||
// 根据DefaultKey和DefaultModifiers设置默认显示值
|
||||
SetDefaultHotkeyForItem(hotkeyItem);
|
||||
LogHelper.WriteLogToFile($"设置默认显示值: {hotkeyItem.HotkeyName}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"设置默认显示值: {hotkeyItem.HotkeyName}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -243,7 +245,7 @@ namespace Ink_Canvas.Windows
|
||||
{
|
||||
try
|
||||
{
|
||||
LogHelper.WriteLogToFile($"收到快捷键变更事件: {e.HotkeyName} -> {e.Modifiers}+{e.Key}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"收到快捷键变更事件: {e.HotkeyName} -> {e.Modifiers}+{e.Key}");
|
||||
|
||||
// 检查快捷键冲突
|
||||
if (IsHotkeyConflict(e.Key, e.Modifiers, e.HotkeyName))
|
||||
@@ -305,30 +307,30 @@ namespace Ink_Canvas.Windows
|
||||
{
|
||||
try
|
||||
{
|
||||
LogHelper.WriteLogToFile($"开始更新快捷键: {hotkeyName} -> {modifiers}+{key}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"开始更新快捷键: {hotkeyName} -> {modifiers}+{key}");
|
||||
|
||||
// 先注销原有的快捷键(如果存在)
|
||||
_hotkeyManager.UnregisterHotkey(hotkeyName);
|
||||
LogHelper.WriteLogToFile($"已注销原有快捷键: {hotkeyName}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"已注销原有快捷键: {hotkeyName}");
|
||||
|
||||
// 根据快捷键名称获取对应的动作
|
||||
var action = GetActionForHotkey(hotkeyName);
|
||||
if (action != null)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"找到快捷键动作: {hotkeyName}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"找到快捷键动作: {hotkeyName}");
|
||||
|
||||
// 直接注册新的快捷键
|
||||
if (_hotkeyManager.RegisterHotkey(hotkeyName, key, modifiers, action))
|
||||
{
|
||||
LogHelper.WriteLogToFile($"成功注册新快捷键: {hotkeyName} -> {modifiers}+{key}", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile($"成功注册新快捷键: {hotkeyName} -> {modifiers}+{key}");
|
||||
|
||||
// 立即保存到配置文件
|
||||
_hotkeyManager.SaveHotkeysToSettings();
|
||||
LogHelper.WriteLogToFile($"已保存快捷键配置", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("已保存快捷键配置");
|
||||
|
||||
// 更新UI显示
|
||||
LoadCurrentHotkeys();
|
||||
LogHelper.WriteLogToFile($"已更新UI显示", LogHelper.LogType.Info);
|
||||
LogHelper.WriteLogToFile("已更新UI显示");
|
||||
|
||||
LogHelper.WriteLogToFile($"快捷键 {hotkeyName} 已更新为 {modifiers}+{key} 并保存", LogHelper.LogType.Event);
|
||||
}
|
||||
@@ -403,7 +405,7 @@ namespace Ink_Canvas.Windows
|
||||
{
|
||||
// 通过反射访问主窗口的penType字段
|
||||
var penTypeField = _mainWindow.GetType().GetField("penType",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
|
||||
if (penTypeField != null)
|
||||
{
|
||||
@@ -411,7 +413,7 @@ namespace Ink_Canvas.Windows
|
||||
|
||||
// 调用CheckPenTypeUIState方法更新UI状态
|
||||
var checkPenTypeMethod = _mainWindow.GetType().GetMethod("CheckPenTypeUIState",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
|
||||
BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
|
||||
if (checkPenTypeMethod != null)
|
||||
{
|
||||
@@ -436,7 +438,7 @@ namespace Ink_Canvas.Windows
|
||||
{
|
||||
// 通过反射访问主窗口的设置面板
|
||||
var settingsBorder = _mainWindow.GetType().GetField("BorderSettings",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(_mainWindow) as System.Windows.Controls.Border;
|
||||
BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(_mainWindow) as Border;
|
||||
|
||||
if (settingsBorder != null)
|
||||
{
|
||||
@@ -445,7 +447,7 @@ namespace Ink_Canvas.Windows
|
||||
|
||||
// 隐藏设置蒙版
|
||||
var settingsMask = _mainWindow.GetType().GetField("BorderSettingsMask",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(_mainWindow) as System.Windows.Controls.Border;
|
||||
BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(_mainWindow) as Border;
|
||||
|
||||
if (settingsMask != null)
|
||||
{
|
||||
@@ -467,7 +469,7 @@ namespace Ink_Canvas.Windows
|
||||
{
|
||||
// 通过反射访问主窗口的设置面板
|
||||
var settingsBorder = _mainWindow.GetType().GetField("BorderSettings",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(_mainWindow) as System.Windows.Controls.Border;
|
||||
BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(_mainWindow) as Border;
|
||||
|
||||
if (settingsBorder != null)
|
||||
{
|
||||
@@ -476,7 +478,7 @@ namespace Ink_Canvas.Windows
|
||||
|
||||
// 显示设置蒙版
|
||||
var settingsMask = _mainWindow.GetType().GetField("BorderSettingsMask",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(_mainWindow) as System.Windows.Controls.Border;
|
||||
BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(_mainWindow) as Border;
|
||||
|
||||
if (settingsMask != null)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
<DropShadowEffect Direction="0" ShadowDepth="0" Opacity="0.1" BlurRadius="3"/>
|
||||
</Border.Effect>
|
||||
<Viewbox Margin="5.5">
|
||||
<ui:SymbolIcon Name="SymbolIconFullscreen" Symbol="FullScreen" Foreground="Black"/>
|
||||
<ui:FontIcon Name="FontIconFullscreen" Glyph="" Foreground="Black"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
<Border x:Name="BtnClose" MouseUp="BtnClose_MouseUp" HorizontalAlignment="Right" VerticalAlignment="Bottom"
|
||||
@@ -90,7 +90,7 @@
|
||||
<DropShadowEffect Direction="0" ShadowDepth="0" Opacity="0.1" BlurRadius="3"/>
|
||||
</Border.Effect>
|
||||
<Viewbox Margin="5.5">
|
||||
<ui:SymbolIcon Symbol="Clear" Foreground="White"/>
|
||||
<ui:FontIcon Glyph="" Foreground="White"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
</ui:SimpleStackPanel>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System.Windows;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using Ink_Canvas.Helpers;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
@@ -31,12 +30,12 @@ namespace Ink_Canvas
|
||||
if (WindowState == WindowState.Normal)
|
||||
{
|
||||
WindowState = WindowState.Maximized;
|
||||
SymbolIconFullscreen.Symbol = Symbol.BackToWindow;
|
||||
FontIconFullscreen.Glyph = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
WindowState = WindowState.Normal;
|
||||
SymbolIconFullscreen.Symbol = Symbol.FullScreen;
|
||||
FontIconFullscreen.Glyph = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,3 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using Ink_Canvas.Helpers.Plugins;
|
||||
using Ink_Canvas.Helpers.Plugins.BuiltIn;
|
||||
using Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel;
|
||||
@@ -12,6 +6,12 @@ using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Threading;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Ink_Canvas.Helpers.Plugins;
|
||||
using Ink_Canvas.Helpers.Plugins.BuiltIn;
|
||||
using Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Microsoft.Win32;
|
||||
using MessageBox = System.Windows.MessageBox;
|
||||
|
||||
namespace Ink_Canvas.Windows
|
||||
@@ -68,11 +68,11 @@ namespace Ink_Canvas.Windows
|
||||
}
|
||||
}
|
||||
|
||||
public string Name => SelectedPlugin?.Name ?? string.Empty;
|
||||
public new string Name => SelectedPlugin?.Name ?? string.Empty;
|
||||
public string Version => SelectedPlugin?.Version?.ToString() ?? string.Empty;
|
||||
public string Author => SelectedPlugin?.Author ?? string.Empty;
|
||||
public string Description => SelectedPlugin?.Description ?? string.Empty;
|
||||
public bool IsEnabled => SelectedPlugin is PluginBase plugin && plugin.IsEnabled;
|
||||
public new bool IsEnabled => SelectedPlugin is PluginBase plugin && plugin.IsEnabled;
|
||||
public bool IsBuiltIn => SelectedPlugin?.IsBuiltIn ?? false;
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
<Border x:Name="BorderBtnRand" MouseUp="BorderBtnRand_MouseUp" Background="#0066BF" Height="70" Width="200" CornerRadius="35">
|
||||
<ui:SimpleStackPanel Margin="3,0" Spacing="20" Orientation="Horizontal" HorizontalAlignment="Center">
|
||||
<Viewbox Margin="0,20">
|
||||
<ui:SymbolIcon Name="SymbolIconStart" Symbol="Contact" Foreground="White"/>
|
||||
<ui:FontIcon Name="FontIconStart" Glyph="" Foreground="White"/>
|
||||
</Viewbox>
|
||||
<TextBlock Text="开抽" Foreground="White" FontSize="32" Margin="-1,-1,4,0" VerticalAlignment="Center"/>
|
||||
</ui:SimpleStackPanel>
|
||||
@@ -113,7 +113,7 @@
|
||||
<Border x:Name="BorderBtnExternalCaller" MouseUp="BorderBtnExternalCaller_MouseUp" Background="#00B894" Height="50" Width="120" CornerRadius="25">
|
||||
<ui:SimpleStackPanel Margin="3,0" Spacing="8" Orientation="Horizontal" HorizontalAlignment="Center">
|
||||
<Viewbox Margin="0,10">
|
||||
<ui:SymbolIcon Symbol="Globe" Foreground="White"/>
|
||||
<ui:FontIcon Glyph="" Foreground="White"/>
|
||||
</Viewbox>
|
||||
<TextBlock Text="外部点名" Foreground="White" FontSize="16" Margin="-1,-1,4,0" VerticalAlignment="Center"/>
|
||||
</ui:SimpleStackPanel>
|
||||
@@ -127,7 +127,7 @@
|
||||
</Border.Effect>
|
||||
<ui:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Center">
|
||||
<Viewbox Margin="15,12">
|
||||
<ui:SymbolIcon Symbol="People" Foreground="Black"/>
|
||||
<ui:FontIcon Glyph="" Foreground="Black"/>
|
||||
</Viewbox>
|
||||
<TextBlock Margin="-5,12,15,12" Name="TextBlockPeopleCount" Text="点击此处以导入名单" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</ui:SimpleStackPanel>
|
||||
@@ -137,7 +137,7 @@
|
||||
<DropShadowEffect Direction="0" ShadowDepth="0" Opacity="0.1" BlurRadius="3"/>
|
||||
</Border.Effect>
|
||||
<Viewbox Margin="14">
|
||||
<ui:SymbolIcon Symbol="Clear" Foreground="White"/>
|
||||
<ui:FontIcon Glyph="" Foreground="White"/>
|
||||
</Viewbox>
|
||||
</Border>
|
||||
</Canvas>
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using Microsoft.VisualBasic;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
@@ -11,6 +8,8 @@ using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Microsoft.VisualBasic;
|
||||
using MessageBox = iNKORE.UI.WPF.Modern.Controls.MessageBox;
|
||||
|
||||
namespace Ink_Canvas
|
||||
@@ -24,7 +23,7 @@ namespace Ink_Canvas
|
||||
{
|
||||
InitializeComponent();
|
||||
AnimationsHelper.ShowWithSlideFromBottomAndFade(this, 0.25);
|
||||
BorderBtnHelp.Visibility = settings.RandSettings.DisplayRandWindowNamesInputBtn == false ? Visibility.Collapsed : Visibility.Visible;
|
||||
BorderBtnHelp.Visibility = !settings.RandSettings.DisplayRandWindowNamesInputBtn ? Visibility.Collapsed : Visibility.Visible;
|
||||
RandMaxPeopleOneTime = settings.RandSettings.RandWindowOnceMaxStudents;
|
||||
RandDoneAutoCloseWaitTime = (int)settings.RandSettings.RandWindowOnceCloseLatency * 1000;
|
||||
|
||||
@@ -69,7 +68,7 @@ namespace Ink_Canvas
|
||||
isAutoClose = IsAutoClose;
|
||||
PeopleControlPane.Opacity = 0.4;
|
||||
PeopleControlPane.IsHitTestVisible = false;
|
||||
BorderBtnHelp.Visibility = settings.RandSettings.DisplayRandWindowNamesInputBtn == false ? Visibility.Collapsed : Visibility.Visible;
|
||||
BorderBtnHelp.Visibility = !settings.RandSettings.DisplayRandWindowNamesInputBtn ? Visibility.Collapsed : Visibility.Visible;
|
||||
RandMaxPeopleOneTime = settings.RandSettings.RandWindowOnceMaxStudents;
|
||||
RandDoneAutoCloseWaitTime = (int)settings.RandSettings.RandWindowOnceCloseLatency * 1000;
|
||||
|
||||
@@ -100,7 +99,7 @@ namespace Ink_Canvas
|
||||
if (RandMaxPeopleOneTime != -1 && TotalCount >= RandMaxPeopleOneTime) return;
|
||||
TotalCount++;
|
||||
LabelNumberCount.Text = TotalCount.ToString();
|
||||
SymbolIconStart.Symbol = Symbol.People;
|
||||
FontIconStart.Glyph = "";
|
||||
BorderBtnAdd.Opacity = 1;
|
||||
BorderBtnMinus.Opacity = 1;
|
||||
}
|
||||
@@ -112,7 +111,7 @@ namespace Ink_Canvas
|
||||
LabelNumberCount.Text = TotalCount.ToString();
|
||||
if (TotalCount == 1)
|
||||
{
|
||||
SymbolIconStart.Symbol = Symbol.Contact;
|
||||
FontIconStart.Glyph = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,71 +20,157 @@
|
||||
Fill="Black"
|
||||
Opacity="0.3" />
|
||||
|
||||
<!-- 透明选择区域遮罩 - 使用正确的几何体操作 -->
|
||||
<Rectangle Name="TransparentSelectionMask"
|
||||
Fill="Black"
|
||||
Opacity="0.3"
|
||||
Visibility="Collapsed">
|
||||
<Rectangle.Clip>
|
||||
<CombinedGeometry GeometryCombineMode="Exclude">
|
||||
<CombinedGeometry.Geometry1>
|
||||
<RectangleGeometry Rect="0,0,10000,10000" />
|
||||
</CombinedGeometry.Geometry1>
|
||||
<CombinedGeometry.Geometry2>
|
||||
<RectangleGeometry x:Name="SelectionClipGeometry" Rect="0,0,0,0" />
|
||||
</CombinedGeometry.Geometry2>
|
||||
</CombinedGeometry>
|
||||
</Rectangle.Clip>
|
||||
</Rectangle>
|
||||
|
||||
<!-- 选择区域容器 -->
|
||||
<Canvas Name="SelectionCanvas">
|
||||
<Canvas Name="SelectionCanvas" Panel.ZIndex="1000">
|
||||
<!-- 矩形选择模式 -->
|
||||
<Rectangle Name="SelectionRectangle"
|
||||
Stroke="Red"
|
||||
StrokeThickness="2"
|
||||
Stroke="White"
|
||||
StrokeThickness="1"
|
||||
Fill="Transparent"
|
||||
Visibility="Collapsed" />
|
||||
|
||||
<!-- 任意形状选择模式 -->
|
||||
<Path Name="SelectionPath"
|
||||
Stroke="Red"
|
||||
StrokeThickness="2"
|
||||
Stroke="White"
|
||||
StrokeThickness="1"
|
||||
Fill="Transparent"
|
||||
Visibility="Collapsed" />
|
||||
|
||||
<!-- 控制点容器 -->
|
||||
<Canvas Name="ControlPointsCanvas" Visibility="Collapsed" Panel.ZIndex="1002">
|
||||
<!-- 四个角控制点 -->
|
||||
<Ellipse Name="TopLeftControl" Width="8" Height="8" Fill="White" Stroke="White" StrokeThickness="1" Cursor="SizeNWSE" />
|
||||
<Ellipse Name="TopRightControl" Width="8" Height="8" Fill="White" Stroke="White" StrokeThickness="1" Cursor="SizeNESW" />
|
||||
<Ellipse Name="BottomLeftControl" Width="8" Height="8" Fill="White" Stroke="White" StrokeThickness="1" Cursor="SizeNESW" />
|
||||
<Ellipse Name="BottomRightControl" Width="8" Height="8" Fill="White" Stroke="White" StrokeThickness="1" Cursor="SizeNWSE" />
|
||||
|
||||
<!-- 四个边控制点 -->
|
||||
<Ellipse Name="TopControl" Width="8" Height="8" Fill="White" Stroke="White" StrokeThickness="1" Cursor="SizeNS" />
|
||||
<Ellipse Name="BottomControl" Width="8" Height="8" Fill="White" Stroke="White" StrokeThickness="1" Cursor="SizeNS" />
|
||||
<Ellipse Name="LeftControl" Width="8" Height="8" Fill="White" Stroke="White" StrokeThickness="1" Cursor="SizeWE" />
|
||||
<Ellipse Name="RightControl" Width="8" Height="8" Fill="White" Stroke="White" StrokeThickness="1" Cursor="SizeWE" />
|
||||
</Canvas>
|
||||
|
||||
<!-- 尺寸信息显示 -->
|
||||
<Border Name="SizeInfoBorder"
|
||||
Background="Black"
|
||||
Opacity="0.8"
|
||||
CornerRadius="3"
|
||||
Background="#1a1a1a"
|
||||
Opacity="0.9"
|
||||
CornerRadius="4"
|
||||
Padding="8,4"
|
||||
Visibility="Collapsed">
|
||||
<TextBlock Name="SizeInfoText"
|
||||
Foreground="White"
|
||||
FontSize="12"
|
||||
FontWeight="Medium"
|
||||
Text="0 x 0" />
|
||||
</Border>
|
||||
</Canvas>
|
||||
|
||||
<!-- 模式切换按钮 -->
|
||||
<StackPanel Orientation="Horizontal"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Top"
|
||||
Margin="0,100,0,0">
|
||||
<Button Name="RectangleModeButton"
|
||||
Content="矩形模式"
|
||||
Margin="5,0"
|
||||
Padding="10,5"
|
||||
Background="#2563eb"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
Click="RectangleModeButton_Click" />
|
||||
<Button Name="FreehandModeButton"
|
||||
Content="自由绘制"
|
||||
Margin="5,0"
|
||||
Padding="10,5"
|
||||
Background="#6b7280"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
Click="FreehandModeButton_Click" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- 提示文字 -->
|
||||
<Border Background="Black"
|
||||
Opacity="0.8"
|
||||
CornerRadius="5"
|
||||
Padding="15,8"
|
||||
<!-- 顶部工具栏 -->
|
||||
<Border Background="#1a1a1a"
|
||||
Opacity="0.95"
|
||||
CornerRadius="8"
|
||||
Padding="12,8"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Top"
|
||||
Margin="0,150,0,0">
|
||||
Margin="0,20,0,0"
|
||||
Panel.ZIndex="1000">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<!-- 模式切换按钮 -->
|
||||
<Button Name="RectangleModeButton"
|
||||
Content="矩形模式"
|
||||
Margin="4,0"
|
||||
Padding="12,6"
|
||||
Background="#2563eb"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontWeight="Medium"
|
||||
Click="RectangleModeButton_Click" />
|
||||
<Button Name="FreehandModeButton"
|
||||
Content="自由绘制"
|
||||
Margin="4,0"
|
||||
Padding="12,6"
|
||||
Background="#6b7280"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontWeight="Medium"
|
||||
Click="FreehandModeButton_Click" />
|
||||
|
||||
<!-- 分隔线 -->
|
||||
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}"
|
||||
Margin="8,0"
|
||||
Background="#404040" />
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<Button Name="ConfirmButton"
|
||||
Content="确认截图"
|
||||
Margin="4,0"
|
||||
Padding="12,6"
|
||||
Background="#059669"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontWeight="Medium"
|
||||
Click="ConfirmButton_Click" />
|
||||
<Button Name="CancelButton"
|
||||
Content="取消"
|
||||
Margin="4,0"
|
||||
Padding="12,6"
|
||||
Background="#dc2626"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontWeight="Medium"
|
||||
Click="CancelButton_Click" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- 提示文字 -->
|
||||
<Border Background="#1a1a1a"
|
||||
Opacity="0.9"
|
||||
CornerRadius="6"
|
||||
Padding="16,10"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Top"
|
||||
Margin="0,80,0,0"
|
||||
Panel.ZIndex="1000">
|
||||
<TextBlock Name="HintText"
|
||||
Text="拖拽鼠标选择矩形区域,或使用自由绘制模式"
|
||||
Foreground="White"
|
||||
FontSize="16" />
|
||||
FontSize="14"
|
||||
FontWeight="Medium" />
|
||||
</Border>
|
||||
|
||||
<!-- 调整模式提示 -->
|
||||
<Border Name="AdjustModeHint"
|
||||
Background="#1a1a1a"
|
||||
Opacity="0.9"
|
||||
CornerRadius="6"
|
||||
Padding="16,10"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Bottom"
|
||||
Margin="0,0,0,20"
|
||||
Visibility="Collapsed"
|
||||
Panel.ZIndex="1000">
|
||||
<TextBlock Text="拖拽控制点调整选择区域,或拖拽边框移动位置"
|
||||
Foreground="White"
|
||||
FontSize="14"
|
||||
FontWeight="Medium" />
|
||||
</Border>
|
||||
</Grid>
|
||||
</Window>
|
||||
|
||||
@@ -1,25 +1,43 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Threading;
|
||||
using Brushes = System.Windows.Media.Brushes;
|
||||
using Color = System.Windows.Media.Color;
|
||||
using DrawingRectangle = System.Drawing.Rectangle;
|
||||
// 为了避免命名冲突,使用别名
|
||||
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
|
||||
using MouseEventArgs = System.Windows.Input.MouseEventArgs;
|
||||
using WpfCanvas = System.Windows.Controls.Canvas;
|
||||
|
||||
namespace Ink_Canvas
|
||||
{
|
||||
public partial class ScreenshotSelectorWindow : Window
|
||||
{
|
||||
private bool _isSelecting = false;
|
||||
private bool _isFreehandMode = false;
|
||||
private bool _isSelecting;
|
||||
private bool _isFreehandMode;
|
||||
private bool _isAdjusting;
|
||||
private bool _isMoving;
|
||||
private Point _startPoint;
|
||||
private Point _currentPoint;
|
||||
private Point _lastMousePosition;
|
||||
private List<Point> _freehandPoints;
|
||||
private Polyline _freehandPolyline;
|
||||
private Rect _currentSelection;
|
||||
private ControlPointType _activeControlPoint = ControlPointType.None;
|
||||
|
||||
// 控制点类型枚举
|
||||
private enum ControlPointType
|
||||
{
|
||||
None,
|
||||
TopLeft, TopRight, BottomLeft, BottomRight,
|
||||
Top, Bottom, Left, Right,
|
||||
Move
|
||||
}
|
||||
|
||||
public DrawingRectangle? SelectedArea { get; private set; }
|
||||
public List<Point> SelectedPath { get; private set; }
|
||||
@@ -34,8 +52,11 @@ namespace Ink_Canvas
|
||||
// 初始化自由绘制模式
|
||||
InitializeFreehandMode();
|
||||
|
||||
// 绑定控制点事件
|
||||
BindControlPointEvents();
|
||||
|
||||
// 隐藏提示文字的定时器
|
||||
var timer = new System.Windows.Threading.DispatcherTimer();
|
||||
var timer = new DispatcherTimer();
|
||||
timer.Interval = TimeSpan.FromSeconds(5);
|
||||
timer.Tick += (s, e) =>
|
||||
{
|
||||
@@ -50,17 +71,41 @@ namespace Ink_Canvas
|
||||
_freehandPoints = new List<Point>();
|
||||
_freehandPolyline = new Polyline
|
||||
{
|
||||
Stroke = Brushes.Red,
|
||||
StrokeThickness = 2,
|
||||
Stroke = Brushes.White,
|
||||
StrokeThickness = 1,
|
||||
Fill = Brushes.Transparent
|
||||
};
|
||||
SelectionCanvas.Children.Add(_freehandPolyline);
|
||||
}
|
||||
|
||||
private void BindControlPointEvents()
|
||||
{
|
||||
// 绑定所有控制点的鼠标事件
|
||||
var controlPoints = new[]
|
||||
{
|
||||
TopLeftControl, TopRightControl, BottomLeftControl, BottomRightControl,
|
||||
TopControl, BottomControl, LeftControl, RightControl
|
||||
};
|
||||
|
||||
foreach (var control in controlPoints)
|
||||
{
|
||||
control.MouseLeftButtonDown += ControlPoint_MouseLeftButtonDown;
|
||||
control.MouseLeftButtonUp += ControlPoint_MouseLeftButtonUp;
|
||||
control.MouseMove += ControlPoint_MouseMove;
|
||||
|
||||
// 确保控制点能够接收鼠标事件
|
||||
control.IsHitTestVisible = true;
|
||||
control.Focusable = false;
|
||||
|
||||
// 设置控制点的Z-index,确保它们在最上层
|
||||
WpfCanvas.SetZIndex(control, 1003);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupFullScreenOverlay()
|
||||
{
|
||||
// 获取所有屏幕的虚拟屏幕边界
|
||||
var virtualScreen = System.Windows.Forms.SystemInformation.VirtualScreen;
|
||||
var virtualScreen = SystemInformation.VirtualScreen;
|
||||
|
||||
// 转换为WPF坐标系统
|
||||
var dpiScale = GetDpiScale();
|
||||
@@ -85,43 +130,83 @@ namespace Ink_Canvas
|
||||
{
|
||||
if (e.Key == Key.Escape)
|
||||
{
|
||||
// 取消截图
|
||||
SelectedArea = null;
|
||||
SelectedPath = null;
|
||||
DialogResult = false;
|
||||
Close();
|
||||
CancelSelection();
|
||||
}
|
||||
else if (e.Key == Key.Enter)
|
||||
{
|
||||
ConfirmSelection();
|
||||
}
|
||||
}
|
||||
|
||||
private void RectangleModeButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 重置所有选择状态
|
||||
ResetSelectionState();
|
||||
|
||||
_isFreehandMode = false;
|
||||
RectangleModeButton.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); // 蓝色
|
||||
FreehandModeButton.Background = new SolidColorBrush(Color.FromRgb(107, 114, 128)); // 灰色
|
||||
HintText.Text = "拖拽鼠标选择矩形区域";
|
||||
|
||||
// 清除自由绘制的内容
|
||||
_freehandPoints.Clear();
|
||||
_freehandPolyline.Points.Clear();
|
||||
SelectionPath.Visibility = Visibility.Collapsed;
|
||||
SelectionRectangle.Visibility = Visibility.Collapsed;
|
||||
HintText.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
private void FreehandModeButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 重置所有选择状态
|
||||
ResetSelectionState();
|
||||
|
||||
_isFreehandMode = true;
|
||||
FreehandModeButton.Background = new SolidColorBrush(Color.FromRgb(37, 99, 235)); // 蓝色
|
||||
RectangleModeButton.Background = new SolidColorBrush(Color.FromRgb(107, 114, 128)); // 灰色
|
||||
HintText.Text = "按住鼠标左键绘制任意形状,松开完成";
|
||||
HintText.Text = "按住鼠标左键绘制任意形状,松开直接截图";
|
||||
HintText.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
// 清除矩形选择的内容
|
||||
SelectionRectangle.Visibility = Visibility.Collapsed;
|
||||
_freehandPoints.Clear();
|
||||
_freehandPolyline.Points.Clear();
|
||||
private void ConfirmButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 在自由绘制模式下,确认按钮不执行任何操作
|
||||
if (_isFreehandMode)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ConfirmSelection();
|
||||
}
|
||||
|
||||
private void CancelButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
CancelSelection();
|
||||
}
|
||||
|
||||
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
// 检查是否点击了UI元素,如果是则不处理选择
|
||||
var hitElement = e.Source as FrameworkElement;
|
||||
if (hitElement != null && (
|
||||
hitElement is Ellipse ||
|
||||
hitElement is System.Windows.Controls.Button ||
|
||||
hitElement is Border ||
|
||||
hitElement is TextBlock ||
|
||||
hitElement is StackPanel ||
|
||||
hitElement is Separator ||
|
||||
hitElement.Name == "SizeInfoBorder" ||
|
||||
hitElement.Name == "HintText" ||
|
||||
hitElement.Name == "AdjustModeHint"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 如果正在调整,忽略新的选择
|
||||
if (_isAdjusting) return;
|
||||
|
||||
// 如果正在选择,先重置状态
|
||||
if (_isSelecting)
|
||||
{
|
||||
_isSelecting = false;
|
||||
ReleaseMouseCapture();
|
||||
}
|
||||
|
||||
// 开始新的选择
|
||||
_isSelecting = true;
|
||||
_startPoint = e.GetPosition(this);
|
||||
_currentPoint = _startPoint;
|
||||
@@ -131,11 +216,14 @@ namespace Ink_Canvas
|
||||
|
||||
if (_isFreehandMode)
|
||||
{
|
||||
// 自由绘制模式
|
||||
// 自由绘制模式:开始绘制
|
||||
_freehandPoints.Clear();
|
||||
_freehandPolyline.Points.Clear();
|
||||
_freehandPoints.Add(_startPoint);
|
||||
_freehandPolyline.Points.Add(_startPoint);
|
||||
|
||||
// 确保自由绘制路径可见
|
||||
_freehandPolyline.Visibility = Visibility.Visible;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -164,6 +252,9 @@ namespace Ink_Canvas
|
||||
// 自由绘制模式:添加点到路径
|
||||
_freehandPoints.Add(_currentPoint);
|
||||
_freehandPolyline.Points.Add(_currentPoint);
|
||||
|
||||
// 确保自由绘制路径可见
|
||||
_freehandPolyline.Visibility = Visibility.Visible;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -182,16 +273,15 @@ namespace Ink_Canvas
|
||||
|
||||
if (_isFreehandMode)
|
||||
{
|
||||
// 自由绘制模式:完成路径
|
||||
if (_freehandPoints.Count > 3) // 至少需要3个点形成有效路径
|
||||
// 自由绘制模式:一笔完成,直接截图
|
||||
if (_freehandPoints.Count > 1) // 只要有点就可以截图
|
||||
{
|
||||
// 创建路径的副本,避免修改原始列表
|
||||
var pathPoints = new List<Point>(_freehandPoints);
|
||||
|
||||
// 确保路径闭合(如果最后一个点不是起始点,则添加起始点)
|
||||
if (pathPoints.Count > 0 &&
|
||||
(Math.Abs(pathPoints[pathPoints.Count - 1].X - _startPoint.X) > 1 ||
|
||||
Math.Abs(pathPoints[pathPoints.Count - 1].Y - _startPoint.Y) > 1))
|
||||
// 简化路径处理,不强制闭合
|
||||
// 如果路径没有闭合,自动添加起始点
|
||||
if (pathPoints.Count > 0)
|
||||
{
|
||||
pathPoints.Add(_startPoint);
|
||||
}
|
||||
@@ -204,42 +294,41 @@ namespace Ink_Canvas
|
||||
|
||||
// 计算边界矩形用于截图
|
||||
var bounds = CalculatePathBounds(optimizedPath);
|
||||
var dpiScale = GetDpiScale();
|
||||
var virtualScreen = System.Windows.Forms.SystemInformation.VirtualScreen;
|
||||
|
||||
// 确保边界矩形有效
|
||||
if (bounds.Width >= 0 && bounds.Height >= 0)
|
||||
{
|
||||
var dpiScale = GetDpiScale();
|
||||
var virtualScreen = SystemInformation.VirtualScreen;
|
||||
|
||||
int screenX = (int)((bounds.X * dpiScale) + virtualScreen.Left);
|
||||
int screenY = (int)((bounds.Y * dpiScale) + virtualScreen.Top);
|
||||
int screenWidth = (int)(bounds.Width * dpiScale);
|
||||
int screenHeight = (int)(bounds.Height * dpiScale);
|
||||
int screenX = (int)((bounds.X * dpiScale) + virtualScreen.Left);
|
||||
int screenY = (int)((bounds.Y * dpiScale) + virtualScreen.Top);
|
||||
int screenWidth = (int)(bounds.Width * dpiScale);
|
||||
int screenHeight = (int)(bounds.Height * dpiScale);
|
||||
|
||||
SelectedArea = new DrawingRectangle(screenX, screenY, screenWidth, screenHeight);
|
||||
DialogResult = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedArea = null;
|
||||
SelectedPath = null;
|
||||
DialogResult = false;
|
||||
SelectedArea = new DrawingRectangle(screenX, screenY, screenWidth, screenHeight);
|
||||
DialogResult = true;
|
||||
Close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 如果自由绘制失败,清除路径并继续
|
||||
_freehandPoints.Clear();
|
||||
_freehandPolyline.Points.Clear();
|
||||
_freehandPolyline.Visibility = Visibility.Collapsed;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 矩形模式
|
||||
// 矩形模式:进入调整模式
|
||||
var rect = GetSelectionRectangle();
|
||||
if (rect.Width > 5 && rect.Height > 5) // 最小尺寸检查
|
||||
{
|
||||
// 转换为屏幕坐标,考虑DPI缩放
|
||||
var dpiScale = GetDpiScale();
|
||||
var virtualScreen = System.Windows.Forms.SystemInformation.VirtualScreen;
|
||||
|
||||
// 计算实际屏幕坐标
|
||||
int screenX = (int)((rect.X * dpiScale) + virtualScreen.Left);
|
||||
int screenY = (int)((rect.Y * dpiScale) + virtualScreen.Top);
|
||||
int screenWidth = (int)(rect.Width * dpiScale);
|
||||
int screenHeight = (int)(rect.Height * dpiScale);
|
||||
|
||||
SelectedArea = new DrawingRectangle(screenX, screenY, screenWidth, screenHeight);
|
||||
DialogResult = true;
|
||||
_currentSelection = rect;
|
||||
_isAdjusting = true;
|
||||
ShowControlPoints();
|
||||
AdjustModeHint.Visibility = Visibility.Visible;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -248,10 +337,160 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
Close();
|
||||
if (!_isAdjusting)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ControlPoint_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (!_isAdjusting) return;
|
||||
|
||||
_isMoving = true;
|
||||
_lastMousePosition = e.GetPosition(this);
|
||||
|
||||
// 确定当前控制点类型
|
||||
var ellipse = sender as Ellipse;
|
||||
if (ellipse == TopLeftControl) _activeControlPoint = ControlPointType.TopLeft;
|
||||
else if (ellipse == TopRightControl) _activeControlPoint = ControlPointType.TopRight;
|
||||
else if (ellipse == BottomLeftControl) _activeControlPoint = ControlPointType.BottomLeft;
|
||||
else if (ellipse == BottomRightControl) _activeControlPoint = ControlPointType.BottomRight;
|
||||
else if (ellipse == TopControl) _activeControlPoint = ControlPointType.Top;
|
||||
else if (ellipse == BottomControl) _activeControlPoint = ControlPointType.Bottom;
|
||||
else if (ellipse == LeftControl) _activeControlPoint = ControlPointType.Left;
|
||||
else if (ellipse == RightControl) _activeControlPoint = ControlPointType.Right;
|
||||
|
||||
// 捕获鼠标到控制点本身,而不是整个窗口
|
||||
ellipse?.CaptureMouse();
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void ControlPoint_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (!_isAdjusting || !_isMoving || _activeControlPoint == ControlPointType.None) return;
|
||||
|
||||
try
|
||||
{
|
||||
var currentPosition = e.GetPosition(this);
|
||||
var delta = currentPosition - _lastMousePosition;
|
||||
|
||||
// 根据控制点类型调整选择区域
|
||||
AdjustSelection(delta);
|
||||
|
||||
_lastMousePosition = currentPosition;
|
||||
e.Handled = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// 如果出现异常,停止移动
|
||||
_isMoving = false;
|
||||
_activeControlPoint = ControlPointType.None;
|
||||
var ellipse = sender as Ellipse;
|
||||
ellipse?.ReleaseMouseCapture();
|
||||
}
|
||||
}
|
||||
|
||||
private void ControlPoint_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (_isMoving)
|
||||
{
|
||||
_isMoving = false;
|
||||
_activeControlPoint = ControlPointType.None;
|
||||
var ellipse = sender as Ellipse;
|
||||
ellipse?.ReleaseMouseCapture();
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void AdjustSelection(Vector delta)
|
||||
{
|
||||
var newRect = _currentSelection;
|
||||
|
||||
switch (_activeControlPoint)
|
||||
{
|
||||
case ControlPointType.TopLeft:
|
||||
newRect.X += delta.X;
|
||||
newRect.Y += delta.Y;
|
||||
newRect.Width -= delta.X;
|
||||
newRect.Height -= delta.Y;
|
||||
break;
|
||||
case ControlPointType.TopRight:
|
||||
newRect.Y += delta.Y;
|
||||
newRect.Width += delta.X;
|
||||
newRect.Height -= delta.Y;
|
||||
break;
|
||||
case ControlPointType.BottomLeft:
|
||||
newRect.X += delta.X;
|
||||
newRect.Width -= delta.X;
|
||||
newRect.Height += delta.Y;
|
||||
break;
|
||||
case ControlPointType.BottomRight:
|
||||
newRect.Width += delta.X;
|
||||
newRect.Height += delta.Y;
|
||||
break;
|
||||
case ControlPointType.Top:
|
||||
newRect.Y += delta.Y;
|
||||
newRect.Height -= delta.Y;
|
||||
break;
|
||||
case ControlPointType.Bottom:
|
||||
newRect.Height += delta.Y;
|
||||
break;
|
||||
case ControlPointType.Left:
|
||||
newRect.X += delta.X;
|
||||
newRect.Width -= delta.X;
|
||||
break;
|
||||
case ControlPointType.Right:
|
||||
newRect.Width += delta.X;
|
||||
break;
|
||||
}
|
||||
|
||||
// 确保最小尺寸
|
||||
if (newRect.Width >= 10 && newRect.Height >= 10)
|
||||
{
|
||||
_currentSelection = newRect;
|
||||
UpdateSelectionDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
private void ShowControlPoints()
|
||||
{
|
||||
ControlPointsCanvas.Visibility = Visibility.Visible;
|
||||
UpdateControlPointsPosition();
|
||||
}
|
||||
|
||||
private void UpdateControlPointsPosition()
|
||||
{
|
||||
var rect = _currentSelection;
|
||||
|
||||
// 更新角控制点位置
|
||||
WpfCanvas.SetLeft(TopLeftControl, rect.Left - 4);
|
||||
WpfCanvas.SetTop(TopLeftControl, rect.Top - 4);
|
||||
|
||||
WpfCanvas.SetLeft(TopRightControl, rect.Right - 4);
|
||||
WpfCanvas.SetTop(TopRightControl, rect.Top - 4);
|
||||
|
||||
WpfCanvas.SetLeft(BottomLeftControl, rect.Left - 4);
|
||||
WpfCanvas.SetTop(BottomLeftControl, rect.Bottom - 4);
|
||||
|
||||
WpfCanvas.SetLeft(BottomRightControl, rect.Right - 4);
|
||||
WpfCanvas.SetTop(BottomRightControl, rect.Bottom - 4);
|
||||
|
||||
// 更新边控制点位置
|
||||
WpfCanvas.SetLeft(TopControl, rect.Left + rect.Width / 2 - 4);
|
||||
WpfCanvas.SetTop(TopControl, rect.Top - 4);
|
||||
|
||||
WpfCanvas.SetLeft(BottomControl, rect.Left + rect.Width / 2 - 4);
|
||||
WpfCanvas.SetTop(BottomControl, rect.Bottom - 4);
|
||||
|
||||
WpfCanvas.SetLeft(LeftControl, rect.Left - 4);
|
||||
WpfCanvas.SetTop(LeftControl, rect.Top + rect.Height / 2 - 4);
|
||||
|
||||
WpfCanvas.SetLeft(RightControl, rect.Right - 4);
|
||||
WpfCanvas.SetTop(RightControl, rect.Top + rect.Height / 2 - 4);
|
||||
}
|
||||
|
||||
private void UpdateSelection()
|
||||
{
|
||||
var rect = GetSelectionRectangle();
|
||||
@@ -262,6 +501,56 @@ namespace Ink_Canvas
|
||||
SelectionRectangle.Width = rect.Width;
|
||||
SelectionRectangle.Height = rect.Height;
|
||||
|
||||
// 更新透明选择区域遮罩
|
||||
UpdateTransparentSelectionMask(rect);
|
||||
|
||||
// 更新尺寸信息
|
||||
SizeInfoText.Text = $"{(int)rect.Width} x {(int)rect.Height}";
|
||||
WpfCanvas.SetLeft(SizeInfoBorder, rect.X);
|
||||
WpfCanvas.SetTop(SizeInfoBorder, rect.Y - 30);
|
||||
|
||||
// 确保尺寸信息不超出屏幕
|
||||
if (WpfCanvas.GetTop(SizeInfoBorder) < 0)
|
||||
{
|
||||
WpfCanvas.SetTop(SizeInfoBorder, rect.Y + rect.Height + 5);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateTransparentSelectionMask(Rect selectionRect)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 更新选择区域的几何体
|
||||
SelectionClipGeometry.Rect = selectionRect;
|
||||
|
||||
// 显示透明遮罩,隐藏原始遮罩
|
||||
TransparentSelectionMask.Visibility = Visibility.Visible;
|
||||
OverlayRectangle.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 如果几何体操作失败,回退到原始遮罩
|
||||
TransparentSelectionMask.Visibility = Visibility.Collapsed;
|
||||
OverlayRectangle.Visibility = Visibility.Visible;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateSelectionDisplay()
|
||||
{
|
||||
var rect = _currentSelection;
|
||||
|
||||
// 更新选择矩形
|
||||
WpfCanvas.SetLeft(SelectionRectangle, rect.X);
|
||||
WpfCanvas.SetTop(SelectionRectangle, rect.Y);
|
||||
SelectionRectangle.Width = rect.Width;
|
||||
SelectionRectangle.Height = rect.Height;
|
||||
|
||||
// 更新透明选择区域遮罩
|
||||
UpdateTransparentSelectionMask(rect);
|
||||
|
||||
// 更新控制点位置
|
||||
UpdateControlPointsPosition();
|
||||
|
||||
// 更新尺寸信息
|
||||
SizeInfoText.Text = $"{(int)rect.Width} x {(int)rect.Height}";
|
||||
WpfCanvas.SetLeft(SizeInfoBorder, rect.X);
|
||||
@@ -284,6 +573,40 @@ namespace Ink_Canvas
|
||||
return new Rect(x, y, width, height);
|
||||
}
|
||||
|
||||
private void ConfirmSelection()
|
||||
{
|
||||
// 在自由绘制模式下,不执行确认操作
|
||||
if (_isFreehandMode)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_isAdjusting)
|
||||
{
|
||||
// 转换为屏幕坐标,考虑DPI缩放
|
||||
var dpiScale = GetDpiScale();
|
||||
var virtualScreen = SystemInformation.VirtualScreen;
|
||||
|
||||
// 计算实际屏幕坐标
|
||||
int screenX = (int)((_currentSelection.X * dpiScale) + virtualScreen.Left);
|
||||
int screenY = (int)((_currentSelection.Y * dpiScale) + virtualScreen.Top);
|
||||
int screenWidth = (int)(_currentSelection.Width * dpiScale);
|
||||
int screenHeight = (int)(_currentSelection.Height * dpiScale);
|
||||
|
||||
SelectedArea = new DrawingRectangle(screenX, screenY, screenWidth, screenHeight);
|
||||
DialogResult = true;
|
||||
}
|
||||
Close();
|
||||
}
|
||||
|
||||
private void CancelSelection()
|
||||
{
|
||||
SelectedArea = null;
|
||||
SelectedPath = null;
|
||||
DialogResult = false;
|
||||
Close();
|
||||
}
|
||||
|
||||
private Rect CalculatePathBounds(List<Point> points)
|
||||
{
|
||||
if (points == null || points.Count == 0)
|
||||
@@ -305,54 +628,106 @@ namespace Ink_Canvas
|
||||
return new Rect(minX, minY, maxX - minX, maxY - minY);
|
||||
}
|
||||
|
||||
// 优化路径:移除重复点和过于接近的点,提高路径质量
|
||||
private List<Point> OptimizePath(List<Point> originalPath)
|
||||
private List<Point> OptimizePath(List<Point> points)
|
||||
{
|
||||
if (originalPath == null || originalPath.Count < 3)
|
||||
return originalPath;
|
||||
if (points == null || points.Count < 3)
|
||||
return points;
|
||||
|
||||
var optimizedPath = new List<Point>();
|
||||
const double minDistance = 2.0; // 最小距离阈值
|
||||
var optimized = new List<Point>();
|
||||
optimized.Add(points[0]);
|
||||
|
||||
// 添加第一个点
|
||||
optimizedPath.Add(originalPath[0]);
|
||||
|
||||
for (int i = 1; i < originalPath.Count - 1; i++)
|
||||
for (int i = 1; i < points.Count - 1; i++)
|
||||
{
|
||||
var currentPoint = originalPath[i];
|
||||
var optimizedPoint = optimizedPath[optimizedPath.Count - 1];
|
||||
var prev = points[i - 1];
|
||||
var current = points[i];
|
||||
var next = points[i + 1];
|
||||
|
||||
// 计算与上一个优化点的距离
|
||||
double distance = Math.Sqrt(
|
||||
Math.Pow(currentPoint.X - optimizedPoint.X, 2) +
|
||||
Math.Pow(currentPoint.Y - optimizedPoint.Y, 2));
|
||||
// 计算当前点到前后两点连线的距离
|
||||
var distance = DistanceToLine(current, prev, next);
|
||||
|
||||
// 如果距离足够大,则添加这个点
|
||||
if (distance >= minDistance)
|
||||
// 进一步降低阈值,保留更多点,确保路径质量
|
||||
if (distance > 0.1) // 从0.5降低到0.1
|
||||
{
|
||||
optimizedPath.Add(currentPoint);
|
||||
optimized.Add(current);
|
||||
}
|
||||
}
|
||||
|
||||
// 添加最后一个点(如果与上一个点距离足够)
|
||||
var lastPoint = originalPath[originalPath.Count - 1];
|
||||
var lastOptimizedPoint = optimizedPath[optimizedPath.Count - 1];
|
||||
double finalDistance = Math.Sqrt(
|
||||
Math.Pow(lastPoint.X - lastOptimizedPoint.X, 2) +
|
||||
Math.Pow(lastPoint.Y - lastOptimizedPoint.Y, 2));
|
||||
optimized.Add(points[points.Count - 1]);
|
||||
return optimized;
|
||||
}
|
||||
|
||||
if (finalDistance >= minDistance)
|
||||
private double DistanceToLine(Point point, Point lineStart, Point lineEnd)
|
||||
{
|
||||
var A = point.X - lineStart.X;
|
||||
var B = point.Y - lineStart.Y;
|
||||
var C = lineEnd.X - lineStart.X;
|
||||
var D = lineEnd.Y - lineStart.Y;
|
||||
|
||||
var dot = A * C + B * D;
|
||||
var lenSq = C * C + D * D;
|
||||
|
||||
if (lenSq == 0) return Math.Sqrt(A * A + B * B);
|
||||
|
||||
var param = dot / lenSq;
|
||||
|
||||
double xx, yy;
|
||||
|
||||
if (param < 0)
|
||||
{
|
||||
optimizedPath.Add(lastPoint);
|
||||
xx = lineStart.X;
|
||||
yy = lineStart.Y;
|
||||
}
|
||||
else if (param > 1)
|
||||
{
|
||||
xx = lineEnd.X;
|
||||
yy = lineEnd.Y;
|
||||
}
|
||||
else
|
||||
{
|
||||
xx = lineStart.X + param * C;
|
||||
yy = lineStart.Y + param * D;
|
||||
}
|
||||
|
||||
// 确保路径至少有3个点
|
||||
if (optimizedPath.Count < 3)
|
||||
{
|
||||
return originalPath;
|
||||
}
|
||||
var dx = point.X - xx;
|
||||
var dy = point.Y - yy;
|
||||
|
||||
return optimizedPath;
|
||||
return Math.Sqrt(dx * dx + dy * dy);
|
||||
}
|
||||
|
||||
private void ResetSelectionState()
|
||||
{
|
||||
// 重置所有选择相关的状态
|
||||
_isSelecting = false;
|
||||
_isAdjusting = false;
|
||||
_isMoving = false;
|
||||
_activeControlPoint = ControlPointType.None;
|
||||
|
||||
// 清除自由绘制的内容
|
||||
_freehandPoints.Clear();
|
||||
_freehandPolyline.Points.Clear();
|
||||
_freehandPolyline.Visibility = Visibility.Collapsed;
|
||||
|
||||
// 清除矩形选择的内容
|
||||
SelectionRectangle.Visibility = Visibility.Collapsed;
|
||||
ControlPointsCanvas.Visibility = Visibility.Collapsed;
|
||||
SizeInfoBorder.Visibility = Visibility.Collapsed;
|
||||
SelectionPath.Visibility = Visibility.Collapsed;
|
||||
AdjustModeHint.Visibility = Visibility.Collapsed;
|
||||
|
||||
// 重置遮罩
|
||||
TransparentSelectionMask.Visibility = Visibility.Collapsed;
|
||||
OverlayRectangle.Visibility = Visibility.Visible;
|
||||
|
||||
// 释放鼠标捕获
|
||||
if (IsMouseCaptured)
|
||||
{
|
||||
ReleaseMouseCapture();
|
||||
}
|
||||
|
||||
// 重置选择区域
|
||||
_currentSelection = new Rect();
|
||||
SelectedArea = null;
|
||||
SelectedPath = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-1
@@ -54,4 +54,8 @@ ICC CE 1.7.X.X更新日志
|
||||
53. 修复开关状态异常
|
||||
54. 优化浮动栏触摸点击
|
||||
55. 优化快捷键
|
||||
|
||||
56. 优化截图功能
|
||||
57. 优化分级系统
|
||||
58. 优化代码结构
|
||||
59. 优化图片插入
|
||||
60. 优化自动更新
|
||||
|
||||
Reference in New Issue
Block a user