Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c42c6c8dfe | |||
| 316d568cbc | |||
| 0b72b1f1b3 | |||
| 25b52def92 | |||
| ab67ea48f0 | |||
| 912c1b91e4 | |||
| d4f1d21634 | |||
| 6c0e7c2e64 | |||
| e054a50b55 | |||
| ff005e6398 | |||
| 74cc8e7dda | |||
| 254d70a787 | |||
| 28b728822c | |||
| 5a53471bcd | |||
| a3fee5d77c | |||
| 6f961225d7 | |||
| 1b0b4f7505 | |||
| fac66fafbd | |||
| b9d6ac3047 | |||
| e7c723de46 | |||
| 10629b253c | |||
| dace6ad486 |
@@ -1 +1 @@
|
|||||||
1.6.3
|
1.6.7
|
||||||
@@ -49,5 +49,5 @@ using System.Windows;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.6.3.0")]
|
[assembly: AssemblyVersion("1.6.7")]
|
||||||
[assembly: AssemblyFileVersion("1.6.3.0")]
|
[assembly: AssemblyFileVersion("1.6.7")]
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using System.Collections.ObjectModel;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace Ink_Canvas.Helpers
|
namespace Ink_Canvas.Helpers
|
||||||
{
|
{
|
||||||
@@ -19,30 +20,48 @@ namespace Ink_Canvas.Helpers
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
string localVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
string localVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Local version: {localVersion}");
|
||||||
|
|
||||||
string remoteAddress = proxy;
|
string remoteAddress = proxy;
|
||||||
remoteAddress += "https://github.com/awesome-iwb/icc-ce/blob/main/AutomaticUpdateVersionControl.txt";
|
string primaryUrl = "https://raw.githubusercontent.com/awesome-iwb/icc-ce/refs/heads/main/AutomaticUpdateVersionControl.txt";
|
||||||
|
string fallbackUrl = "https://raw.bgithub.xyz/awesome-iwb/icc-ce/refs/heads/main/AutomaticUpdateVersionControl.txt";
|
||||||
|
|
||||||
|
// 先尝试主地址
|
||||||
|
remoteAddress += primaryUrl;
|
||||||
string remoteVersion = await GetRemoteVersion(remoteAddress);
|
string remoteVersion = await GetRemoteVersion(remoteAddress);
|
||||||
|
|
||||||
|
// 如果主地址失败,尝试备用地址
|
||||||
|
if (remoteVersion == null)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Primary URL failed, trying fallback URL");
|
||||||
|
remoteVersion = await GetRemoteVersion(proxy + fallbackUrl);
|
||||||
|
}
|
||||||
|
|
||||||
if (remoteVersion != null)
|
if (remoteVersion != null)
|
||||||
{
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Remote version: {remoteVersion}");
|
||||||
Version local = new Version(localVersion);
|
Version local = new Version(localVersion);
|
||||||
Version remote = new Version(remoteVersion);
|
Version remote = new Version(remoteVersion);
|
||||||
if (remote > local)
|
if (remote > local)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile("AutoUpdate | New version Availble: " + remoteVersion);
|
LogHelper.WriteLogToFile($"AutoUpdate | New version available: {remoteVersion}");
|
||||||
return remoteVersion;
|
return remoteVersion;
|
||||||
}
|
}
|
||||||
else return null;
|
else
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Current version is up to date");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile("Failed to retrieve remote version.", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile("AutoUpdate | Failed to retrieve remote version from both URLs.", LogHelper.LogType.Error);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"AutoUpdate | Error: {ex.Message}");
|
LogHelper.WriteLogToFile($"AutoUpdate | Error in CheckForUpdates: {ex.Message}", LogHelper.LogType.Error);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,15 +72,72 @@ namespace Ink_Canvas.Helpers
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
HttpResponseMessage response = await client.GetAsync(fileUrl);
|
// Set a reasonable timeout
|
||||||
|
client.Timeout = TimeSpan.FromSeconds(10); // 减少超时时间以便更快切换到备用地址
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Sending HTTP request to: {fileUrl}");
|
||||||
|
|
||||||
|
// 使用带超时的Task.WhenAny来确保请求不会无限期等待
|
||||||
|
var downloadTask = client.GetAsync(fileUrl);
|
||||||
|
var timeoutTask = Task.Delay(client.Timeout);
|
||||||
|
|
||||||
|
var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
|
||||||
|
if (completedTask == timeoutTask)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Request timed out after {client.Timeout.TotalSeconds} seconds", LogHelper.LogType.Error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 请求完成,检查结果
|
||||||
|
HttpResponseMessage response = await downloadTask;
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | HTTP response status: {response.StatusCode}");
|
||||||
response.EnsureSuccessStatusCode();
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
return await response.Content.ReadAsStringAsync();
|
string content = await response.Content.ReadAsStringAsync();
|
||||||
|
// Trim any whitespace, newlines, etc.
|
||||||
|
content = content.Trim();
|
||||||
|
|
||||||
|
// If the content contains HTML (likely the GitHub view page instead of raw content),
|
||||||
|
// try to extract the version number
|
||||||
|
if (content.Contains("<html") || content.Contains("<!DOCTYPE"))
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Received HTML content instead of raw version number - trying to extract version");
|
||||||
|
// Try to extract version from GitHub page - look for text content in the file
|
||||||
|
int startPos = content.IndexOf("<table");
|
||||||
|
if (startPos > 0)
|
||||||
|
{
|
||||||
|
int endPos = content.IndexOf("</table>", startPos);
|
||||||
|
if (endPos > startPos)
|
||||||
|
{
|
||||||
|
string tableContent = content.Substring(startPos, endPos - startPos);
|
||||||
|
// Look for the version number pattern (like 1.2.3 or 1.2.3.4)
|
||||||
|
var match = System.Text.RegularExpressions.Regex.Match(tableContent, @"(\d+\.\d+\.\d+(\.\d+)?)");
|
||||||
|
if (match.Success)
|
||||||
|
{
|
||||||
|
content = match.Groups[1].Value;
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Extracted version from HTML: {content}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Could not extract version from HTML content");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Response content: {content}");
|
||||||
|
return content;
|
||||||
}
|
}
|
||||||
catch (HttpRequestException ex)
|
catch (HttpRequestException ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | HTTP request error: {ex.Message}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"AutoUpdate | HTTP request error: {ex.Message}", LogHelper.LogType.Error);
|
||||||
}
|
}
|
||||||
|
catch (TaskCanceledException ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Request timed out: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | Error: {ex.Message}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"AutoUpdate | Error: {ex.Message}", LogHelper.LogType.Error);
|
||||||
@@ -71,7 +147,7 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string updatesFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Ink Canvas Annotation", "AutoUpdate");
|
private static string updatesFolderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "AutoUpdate");
|
||||||
private static string statusFilePath = null;
|
private static string statusFilePath = null;
|
||||||
|
|
||||||
public static async Task<bool> DownloadSetupFileAndSaveStatus(string version, string proxy = "")
|
public static async Task<bool> DownloadSetupFileAndSaveStatus(string version, string proxy = "")
|
||||||
@@ -86,50 +162,203 @@ namespace Ink_Canvas.Helpers
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
string downloadUrl = $"{proxy}https://github.com/awesome-iwb/icc-ce/releases/download/{version}/InkCanvasForClass.CE.{version}.zip";
|
// Ensure update directory exists
|
||||||
|
if (!Directory.Exists(updatesFolderPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(updatesFolderPath);
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Created updates directory: {updatesFolderPath}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 主下载地址
|
||||||
|
string primaryUrl = $"{proxy}https://github.com/awesome-iwb/icc-ce/releases/download/{version}/InkCanvasForClass.CE.{version}.zip";
|
||||||
|
// 备用下载地址
|
||||||
|
string fallbackUrl = $"{proxy}https://bgithub.xyz/awesome-iwb/icc-ce/releases/download/{version}/InkCanvasForClass.CE.{version}.zip";
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Primary download URL: {primaryUrl}");
|
||||||
|
|
||||||
SaveDownloadStatus(false);
|
SaveDownloadStatus(false);
|
||||||
string zipFilePath = Path.Combine(updatesFolderPath, $"InkCanvasForClass.CE.{version}.zip");
|
string zipFilePath = Path.Combine(updatesFolderPath, $"InkCanvasForClass.CE.{version}.zip");
|
||||||
await DownloadFile(downloadUrl, zipFilePath);
|
LogHelper.WriteLogToFile($"AutoUpdate | Target file path: {zipFilePath}");
|
||||||
SaveDownloadStatus(true);
|
|
||||||
|
// 先尝试主地址下载
|
||||||
LogHelper.WriteLogToFile("AutoUpdate | Setup file successfully downloaded.");
|
bool downloadSuccess = await DownloadFile(primaryUrl, zipFilePath);
|
||||||
return true;
|
|
||||||
|
// 如果主地址下载失败,尝试备用地址
|
||||||
|
if (!downloadSuccess)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Primary download failed, trying fallback URL: {fallbackUrl}");
|
||||||
|
downloadSuccess = await DownloadFile(fallbackUrl, zipFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (downloadSuccess)
|
||||||
|
{
|
||||||
|
SaveDownloadStatus(true);
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Setup file successfully downloaded.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Failed to download the update file from both URLs.", LogHelper.LogType.Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | Error downloading update: {ex.Message}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"AutoUpdate | Error downloading update: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Inner exception: {ex.InnerException.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
|
|
||||||
SaveDownloadStatus(false);
|
SaveDownloadStatus(false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task DownloadFile(string fileUrl, string destinationPath)
|
private static async Task<bool> DownloadFile(string fileUrl, string destinationPath)
|
||||||
{
|
{
|
||||||
using (HttpClient client = new HttpClient())
|
using (HttpClient client = new HttpClient())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
HttpResponseMessage response = await client.GetAsync(fileUrl);
|
// Configure client
|
||||||
response.EnsureSuccessStatusCode();
|
client.Timeout = TimeSpan.FromMinutes(5); // Longer timeout for downloading larger files
|
||||||
|
client.DefaultRequestHeaders.Add("User-Agent", "ICC-CE Auto Updater");
|
||||||
using (FileStream fileStream = File.Create(destinationPath))
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Downloading from: {fileUrl}");
|
||||||
|
|
||||||
|
// 创建临时文件路径
|
||||||
|
string tempFilePath = destinationPath + ".tmp";
|
||||||
|
|
||||||
|
// 确保目标目录存在
|
||||||
|
string directory = Path.GetDirectoryName(destinationPath);
|
||||||
|
if (!Directory.Exists(directory))
|
||||||
{
|
{
|
||||||
await response.Content.CopyToAsync(fileStream);
|
Directory.CreateDirectory(directory);
|
||||||
fileStream.Close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 使用带超时的Task.WhenAny来确保请求不会无限期等待
|
||||||
|
var downloadTask = client.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead);
|
||||||
|
var initialTimeoutTask = Task.Delay(TimeSpan.FromSeconds(30)); // 30秒内必须有响应
|
||||||
|
|
||||||
|
var completedTask = await Task.WhenAny(downloadTask, initialTimeoutTask);
|
||||||
|
if (completedTask == initialTimeoutTask)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Initial connection timed out after 30 seconds", LogHelper.LogType.Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 请求完成,检查结果
|
||||||
|
HttpResponseMessage response = await downloadTask;
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | HTTP response status: {response.StatusCode}");
|
||||||
|
response.EnsureSuccessStatusCode();
|
||||||
|
|
||||||
|
// 获取文件总大小
|
||||||
|
long? totalBytes = response.Content.Headers.ContentLength;
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | File size: {(totalBytes.HasValue ? (totalBytes.Value / 1024.0 / 1024.0).ToString("F2") + " MB" : "Unknown")}");
|
||||||
|
|
||||||
|
// 创建临时文件流
|
||||||
|
using (var fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||||
|
{
|
||||||
|
// 获取下载流
|
||||||
|
using (var downloadStream = await response.Content.ReadAsStreamAsync())
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[8192]; // 8KB buffer
|
||||||
|
long totalBytesRead = 0;
|
||||||
|
int bytesRead;
|
||||||
|
DateTime lastProgressUpdate = DateTime.Now;
|
||||||
|
|
||||||
|
// 设置下载超时 - 如果60秒内没有数据传输,则认为下载超时
|
||||||
|
var downloadTimeoutTask = Task.Delay(TimeSpan.FromSeconds(60));
|
||||||
|
var readTask = Task.Run(async () => {
|
||||||
|
while ((bytesRead = await downloadStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
|
||||||
|
{
|
||||||
|
await fileStream.WriteAsync(buffer, 0, bytesRead);
|
||||||
|
totalBytesRead += bytesRead;
|
||||||
|
|
||||||
|
// 每5秒更新一次进度
|
||||||
|
if ((DateTime.Now - lastProgressUpdate).TotalSeconds >= 5)
|
||||||
|
{
|
||||||
|
if (totalBytes.HasValue)
|
||||||
|
{
|
||||||
|
double percentage = (double)totalBytesRead / totalBytes.Value * 100;
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Download progress: {percentage:F1}% ({(totalBytesRead / 1024.0 / 1024.0):F2} MB / {(totalBytes.Value / 1024.0 / 1024.0):F2} MB)");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Downloaded: {(totalBytesRead / 1024.0 / 1024.0):F2} MB");
|
||||||
|
}
|
||||||
|
lastProgressUpdate = DateTime.Now;
|
||||||
|
|
||||||
|
// 重置下载超时
|
||||||
|
downloadTimeoutTask = Task.Delay(TimeSpan.FromSeconds(60));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 等待下载完成或超时
|
||||||
|
if (await Task.WhenAny(readTask, downloadTimeoutTask) == downloadTimeoutTask)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Download timed out after 60 seconds of inactivity", LogHelper.LogType.Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保下载任务完成
|
||||||
|
bool downloadCompleted = await readTask;
|
||||||
|
|
||||||
|
if (downloadCompleted)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Download completed: {(totalBytesRead / 1024.0 / 1024.0):F2} MB");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果临时文件存在,则将其移动到目标位置
|
||||||
|
if (File.Exists(tempFilePath))
|
||||||
|
{
|
||||||
|
// 如果目标文件已存在,先删除
|
||||||
|
if (File.Exists(destinationPath))
|
||||||
|
{
|
||||||
|
File.Delete(destinationPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
File.Move(tempFilePath, destinationPath);
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | File saved to: {destinationPath}");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
catch (HttpRequestException ex)
|
catch (HttpRequestException ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"AutoUpdate | HTTP request error: {ex.Message}");
|
LogHelper.WriteLogToFile($"AutoUpdate | HTTP request error: {ex.Message}", LogHelper.LogType.Error);
|
||||||
throw;
|
}
|
||||||
|
catch (TaskCanceledException ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Download timed out: {ex.Message}", LogHelper.LogType.Error);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"AutoUpdate | Error: {ex.Message}");
|
LogHelper.WriteLogToFile($"AutoUpdate | Error downloading file: {ex.Message}", LogHelper.LogType.Error);
|
||||||
throw;
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Inner exception: {ex.InnerException.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 清理临时文件
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string tempFilePath = destinationPath + ".tmp";
|
||||||
|
if (File.Exists(tempFilePath))
|
||||||
|
{
|
||||||
|
File.Delete(tempFilePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,6 +387,7 @@ namespace Ink_Canvas.Helpers
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
string zipFilePath = Path.Combine(updatesFolderPath, $"InkCanvasForClass.CE.{version}.zip");
|
string zipFilePath = Path.Combine(updatesFolderPath, $"InkCanvasForClass.CE.{version}.zip");
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Checking for ZIP file: {zipFilePath}");
|
||||||
|
|
||||||
if (!File.Exists(zipFilePath))
|
if (!File.Exists(zipFilePath))
|
||||||
{
|
{
|
||||||
@@ -165,84 +395,290 @@ namespace Ink_Canvas.Helpers
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verify ZIP file size and validity
|
||||||
|
FileInfo fileInfo = new FileInfo(zipFilePath);
|
||||||
|
if (fileInfo.Length == 0)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | ZIP file is empty, cannot continue", LogHelper.LogType.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | ZIP file size: {fileInfo.Length} bytes");
|
||||||
|
|
||||||
|
// 获取当前应用程序路径和进程ID
|
||||||
|
string currentAppDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
||||||
|
int currentProcessId = Process.GetCurrentProcess().Id;
|
||||||
|
string appPath = Assembly.GetExecutingAssembly().Location;
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Current application directory: {currentAppDir}");
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Current process ID: {currentProcessId}");
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Silent update mode: {isInSilence}");
|
||||||
|
|
||||||
|
// 创建批处理文件来执行更新操作
|
||||||
|
string batchFilePath = Path.Combine(Path.GetTempPath(), "UpdateICC_" + Guid.NewGuid().ToString().Substring(0, 8) + ".bat");
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Creating update batch file: {batchFilePath}");
|
||||||
|
|
||||||
|
// 构建批处理文件内容
|
||||||
|
StringBuilder batchContent = new StringBuilder();
|
||||||
|
batchContent.AppendLine("@echo off");
|
||||||
|
|
||||||
|
// 使窗口隐藏(使用VBS脚本运行隐藏窗口)
|
||||||
|
batchContent.AppendLine("echo Set objShell = CreateObject(\"WScript.Shell\") > \"%temp%\\hideme.vbs\"");
|
||||||
|
batchContent.AppendLine("echo objShell.Run \"cmd /c \"\"\" ^& WScript.Arguments(0) ^& \"\"\"\", 0, True >> \"%temp%\\hideme.vbs\"");
|
||||||
|
batchContent.AppendLine($"echo Wscript.Sleep 100 >> \"%temp%\\hideme.vbs\"");
|
||||||
|
|
||||||
|
// 创建真正的更新批处理文件
|
||||||
|
string updateBatPath = Path.Combine(Path.GetTempPath(), "ICCUpdate_" + Guid.NewGuid().ToString().Substring(0, 8) + ".bat");
|
||||||
|
batchContent.AppendLine($"echo @echo off > \"{updateBatPath}\"");
|
||||||
|
|
||||||
|
// 写入等待进程退出的代码到更新批处理文件
|
||||||
|
batchContent.AppendLine($"echo set PROC_ID={currentProcessId} >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo :CHECK_PROCESS >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo tasklist /fi \"PID eq %PROC_ID%\" ^| find \"%PROC_ID%\" ^> nul >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo if %%ERRORLEVEL%% == 0 ( >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo timeout /t 1 /nobreak ^> nul >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo goto CHECK_PROCESS >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo ) >> \"{updateBatPath}\"");
|
||||||
|
|
||||||
|
// 应用程序已关闭,开始更新操作
|
||||||
|
batchContent.AppendLine($"echo echo Application closed, starting update process... >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo timeout /t 2 /nobreak ^> nul >> \"{updateBatPath}\"");
|
||||||
|
|
||||||
// 创建临时解压目录
|
// 创建临时解压目录
|
||||||
string extractPath = Path.Combine(updatesFolderPath, $"Extract_{version}");
|
string extractPath = Path.Combine(updatesFolderPath, $"Extract_{version}");
|
||||||
if (Directory.Exists(extractPath))
|
batchContent.AppendLine($"echo echo Extracting update files... >> \"{updateBatPath}\"");
|
||||||
{
|
batchContent.AppendLine($"echo if exist \"{extractPath}\" rd /s /q \"{extractPath}\" >> \"{updateBatPath}\"");
|
||||||
Directory.Delete(extractPath, true);
|
batchContent.AppendLine($"echo mkdir \"{extractPath}\" >> \"{updateBatPath}\"");
|
||||||
}
|
|
||||||
Directory.CreateDirectory(extractPath);
|
// PowerShell解压ZIP文件(因为批处理不直接支持ZIP解压)
|
||||||
|
batchContent.AppendLine($"echo powershell -command \"Expand-Archive -Path '{zipFilePath.Replace("'", "''")}' -DestinationPath '{extractPath.Replace("'", "''")}' -Force\" >> \"{updateBatPath}\"");
|
||||||
// 解压ZIP文件
|
batchContent.AppendLine($"echo if %%ERRORLEVEL%% neq 0 ( >> \"{updateBatPath}\"");
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | Extracting ZIP file to: {extractPath}");
|
batchContent.AppendLine($"echo goto ERROR_EXIT >> \"{updateBatPath}\"");
|
||||||
ZipFile.ExtractToDirectory(zipFilePath, extractPath);
|
batchContent.AppendLine($"echo ) >> \"{updateBatPath}\"");
|
||||||
|
|
||||||
// 获取当前应用程序路径
|
// 复制文件到应用程序目录
|
||||||
string currentAppDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
batchContent.AppendLine($"echo echo Copying updated files to application directory... >> \"{updateBatPath}\"");
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | Current application directory: {currentAppDir}");
|
batchContent.AppendLine($"echo xcopy /s /y /e \"{extractPath}\\*\" \"{currentAppDir}\\\" >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo if %%ERRORLEVEL%% neq 0 ( >> \"{updateBatPath}\"");
|
||||||
// 复制解压的文件到应用程序目录
|
batchContent.AppendLine($"echo goto ERROR_EXIT >> \"{updateBatPath}\"");
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | Copying files to application directory");
|
batchContent.AppendLine($"echo ) >> \"{updateBatPath}\"");
|
||||||
CopyDirectory(extractPath, currentAppDir);
|
|
||||||
|
|
||||||
// 清理临时文件
|
// 清理临时文件
|
||||||
if (Directory.Exists(extractPath))
|
batchContent.AppendLine($"echo echo Cleaning up temporary files... >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo if exist \"{extractPath}\" rd /s /q \"{extractPath}\" >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo if exist \"{zipFilePath}\" del /f /q \"{zipFilePath}\" >> \"{updateBatPath}\"");
|
||||||
|
|
||||||
|
// 启动更新后的应用程序
|
||||||
|
batchContent.AppendLine($"echo echo Update completed successfully! >> \"{updateBatPath}\"");
|
||||||
|
|
||||||
|
// 根据是否为静默更新模式决定是否自动启动应用程序
|
||||||
|
if (isInSilence)
|
||||||
{
|
{
|
||||||
Directory.Delete(extractPath, true);
|
// 静默更新模式下,自动启动应用程序
|
||||||
|
batchContent.AppendLine($"echo echo 自动启动应用程序... >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo start \"\" \"{appPath}\" >> \"{updateBatPath}\"");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 非静默模式下,检查应用程序是否已经在运行
|
||||||
|
batchContent.AppendLine($"echo :: 检查应用程序是否已经在运行 >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo tasklist /FI \"IMAGENAME eq Ink Canvas.exe\" | find /i \"Ink Canvas.exe\" > nul >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo if %%ERRORLEVEL%% neq 0 ( >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo echo 启动应用程序... >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo start \"\" \"{appPath}\" >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo ) else ( >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo echo 应用程序已经在运行,不再重复启动 >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo ) >> \"{updateBatPath}\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
batchContent.AppendLine($"echo exit /b 0 >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo goto EXIT >> \"{updateBatPath}\"");
|
||||||
|
|
||||||
|
// 错误退出处理
|
||||||
|
if (isInSilence)
|
||||||
|
{
|
||||||
|
// 静默模式下,不显示错误提示
|
||||||
|
batchContent.AppendLine($"echo :ERROR_EXIT >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo echo Update failed! >> \"%temp%\\icc_update_error.log\" >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo exit /b 1 >> \"{updateBatPath}\"");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 非静默模式下,显示错误提示
|
||||||
|
batchContent.AppendLine($"echo :ERROR_EXIT >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo start \"\" cmd /c \"echo Update failed! ^& pause\" >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo exit /b 1 >> \"{updateBatPath}\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除批处理文件自身
|
||||||
|
batchContent.AppendLine($"echo :EXIT >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo del \"{updateBatPath}\" >> \"{updateBatPath}\"");
|
||||||
|
batchContent.AppendLine($"echo exit >> \"{updateBatPath}\"");
|
||||||
|
|
||||||
// 重启应用程序
|
// 使用VBS脚本执行更新批处理文件(隐藏窗口)
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | Update completed, restarting application");
|
batchContent.AppendLine($"wscript \"%temp%\\hideme.vbs\" \"{updateBatPath}\"");
|
||||||
RestartApplication();
|
batchContent.AppendLine("del \"%temp%\\hideme.vbs\"");
|
||||||
|
batchContent.AppendLine("exit");
|
||||||
|
|
||||||
|
// 写入批处理文件
|
||||||
|
File.WriteAllText(batchFilePath, batchContent.ToString());
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Created update batch file");
|
||||||
|
|
||||||
|
// 启动批处理文件(隐藏窗口)
|
||||||
|
Process.Start(new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = batchFilePath,
|
||||||
|
CreateNoWindow = true,
|
||||||
|
UseShellExecute = true,
|
||||||
|
WindowStyle = ProcessWindowStyle.Hidden
|
||||||
|
});
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Started update batch process with hidden window");
|
||||||
|
|
||||||
|
// 应用程序将由用户手动关闭或由MainWindow中的代码关闭
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | Error installing update: {ex.Message}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"AutoUpdate | Error preparing update installation: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Inner exception: {ex.InnerException.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CopyDirectory(string sourceDir, string destinationDir)
|
private static bool CopyDirectory(string sourceDir, string destinationDir)
|
||||||
{
|
{
|
||||||
// 创建目标目录(如果不存在)
|
bool allCopiesSuccessful = true;
|
||||||
Directory.CreateDirectory(destinationDir);
|
|
||||||
|
try
|
||||||
// 复制所有文件
|
|
||||||
foreach (string filePath in Directory.GetFiles(sourceDir))
|
|
||||||
{
|
{
|
||||||
string fileName = Path.GetFileName(filePath);
|
// 创建目标目录(如果不存在)
|
||||||
string destPath = Path.Combine(destinationDir, fileName);
|
Directory.CreateDirectory(destinationDir);
|
||||||
try
|
LogHelper.WriteLogToFile($"AutoUpdate | Created/verified destination directory: {destinationDir}");
|
||||||
|
|
||||||
|
// 复制所有文件
|
||||||
|
foreach (string filePath in Directory.GetFiles(sourceDir))
|
||||||
{
|
{
|
||||||
// 如果目标文件存在,先删除
|
string fileName = Path.GetFileName(filePath);
|
||||||
if (File.Exists(destPath))
|
string destPath = Path.Combine(destinationDir, fileName);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
File.Delete(destPath);
|
LogHelper.WriteLogToFile($"AutoUpdate | Copying file: {fileName}");
|
||||||
|
|
||||||
|
// 如果目标文件存在,先删除
|
||||||
|
if (File.Exists(destPath))
|
||||||
|
{
|
||||||
|
File.Delete(destPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
File.Copy(filePath, destPath);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
allCopiesSuccessful = false;
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Error copying file {fileName}: {ex.Message}", LogHelper.LogType.Error);
|
||||||
}
|
}
|
||||||
File.Copy(filePath, destPath);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate | Error copying file {fileName}: {ex.Message}", LogHelper.LogType.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 递归复制所有子目录
|
// 递归复制所有子目录
|
||||||
foreach (string subDirPath in Directory.GetDirectories(sourceDir))
|
foreach (string subDirPath in Directory.GetDirectories(sourceDir))
|
||||||
|
{
|
||||||
|
string subDirName = Path.GetFileName(subDirPath);
|
||||||
|
string destSubDir = Path.Combine(destinationDir, subDirName);
|
||||||
|
|
||||||
|
bool subDirCopyResult = CopyDirectory(subDirPath, destSubDir);
|
||||||
|
if (!subDirCopyResult)
|
||||||
|
{
|
||||||
|
allCopiesSuccessful = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return allCopiesSuccessful;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
string subDirName = Path.GetFileName(subDirPath);
|
LogHelper.WriteLogToFile($"AutoUpdate | Error copying directory {sourceDir}: {ex.Message}", LogHelper.LogType.Error);
|
||||||
string destSubDir = Path.Combine(destinationDir, subDirName);
|
return false;
|
||||||
CopyDirectory(subDirPath, destSubDir);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RestartApplication()
|
private static void RestartApplication()
|
||||||
{
|
{
|
||||||
string appPath = Assembly.GetExecutingAssembly().Location;
|
try
|
||||||
Process.Start(appPath);
|
|
||||||
Application.Current.Dispatcher.Invoke(() =>
|
|
||||||
{
|
{
|
||||||
Application.Current.Shutdown();
|
string appPath = Assembly.GetExecutingAssembly().Location;
|
||||||
});
|
LogHelper.WriteLogToFile($"AutoUpdate | Restarting application: {appPath}");
|
||||||
|
|
||||||
|
// Create a batch file to wait briefly and then start the application
|
||||||
|
// This allows the current process to fully exit before starting the new instance
|
||||||
|
string batchFilePath = Path.Combine(Path.GetTempPath(), "RestartICC_" + Guid.NewGuid().ToString().Substring(0, 8) + ".bat");
|
||||||
|
|
||||||
|
string batchContent =
|
||||||
|
"@echo off\r\n" +
|
||||||
|
"timeout /t 2 /nobreak >nul\r\n" +
|
||||||
|
":: 检查应用程序是否已经在运行\r\n" +
|
||||||
|
"tasklist /FI \"IMAGENAME eq Ink Canvas.exe\" | find /i \"Ink Canvas.exe\" > nul\r\n" +
|
||||||
|
"if %ERRORLEVEL% neq 0 (\r\n" +
|
||||||
|
" echo 启动应用程序...\r\n" +
|
||||||
|
$" start \"\" \"{appPath}\"\r\n" +
|
||||||
|
") else (\r\n" +
|
||||||
|
" echo 应用程序已经在运行,不再重复启动\r\n" +
|
||||||
|
")\r\n" +
|
||||||
|
"timeout /t 1 /nobreak >nul\r\n" +
|
||||||
|
"del \"%~f0\"\r\n" +
|
||||||
|
"exit\r\n"; // 确保批处理进程结束
|
||||||
|
|
||||||
|
File.WriteAllText(batchFilePath, batchContent);
|
||||||
|
|
||||||
|
// Start the batch file
|
||||||
|
Process.Start(new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = "cmd.exe",
|
||||||
|
Arguments = $"/c start \"\" \"{batchFilePath}\"",
|
||||||
|
CreateNoWindow = true,
|
||||||
|
UseShellExecute = false
|
||||||
|
});
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Created restart script at {batchFilePath}");
|
||||||
|
|
||||||
|
// Shutdown the application
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Shutting down application for restart");
|
||||||
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
Application.Current.Shutdown();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Error restarting application: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
|
||||||
|
// Fallback direct restart approach
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string appPath = Assembly.GetExecutingAssembly().Location;
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Attempting direct restart: {appPath}");
|
||||||
|
|
||||||
|
// 检查是否已有实例运行
|
||||||
|
Process[] processes = Process.GetProcessesByName("Ink Canvas");
|
||||||
|
if (processes.Length <= 1) // 只有当前进程
|
||||||
|
{
|
||||||
|
Process.Start(appPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Application already running, not starting a new instance");
|
||||||
|
}
|
||||||
|
|
||||||
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
Application.Current.Shutdown();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception fallbackEx)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Fallback restart also failed: {fallbackEx.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ExecuteCommandLine(string command)
|
private static void ExecuteCommandLine(string command)
|
||||||
@@ -252,7 +688,7 @@ namespace Ink_Canvas.Helpers
|
|||||||
ProcessStartInfo processStartInfo = new ProcessStartInfo
|
ProcessStartInfo processStartInfo = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
FileName = "cmd.exe",
|
FileName = "cmd.exe",
|
||||||
Arguments = $"/c {command}",
|
Arguments = $"/c {command} & exit", // 添加exit确保cmd进程退出
|
||||||
RedirectStandardOutput = true,
|
RedirectStandardOutput = true,
|
||||||
RedirectStandardError = true,
|
RedirectStandardError = true,
|
||||||
UseShellExecute = false,
|
UseShellExecute = false,
|
||||||
@@ -262,12 +698,20 @@ namespace Ink_Canvas.Helpers
|
|||||||
using (Process process = new Process { StartInfo = processStartInfo })
|
using (Process process = new Process { StartInfo = processStartInfo })
|
||||||
{
|
{
|
||||||
process.Start();
|
process.Start();
|
||||||
|
// 设置一个超时时间
|
||||||
|
bool exited = process.WaitForExit(500); // 等待500毫秒
|
||||||
|
if (!exited)
|
||||||
|
{
|
||||||
|
// 不等待进程完成,让它在后台运行
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Command is running in background");
|
||||||
|
}
|
||||||
Application.Current.Shutdown();
|
Application.Current.Shutdown();
|
||||||
/*process.WaitForExit();
|
|
||||||
int exitCode = process.ExitCode;*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch { }
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Error executing command: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DeleteUpdatesFolder()
|
public static void DeleteUpdatesFolder()
|
||||||
@@ -276,12 +720,53 @@ namespace Ink_Canvas.Helpers
|
|||||||
{
|
{
|
||||||
if (Directory.Exists(updatesFolderPath))
|
if (Directory.Exists(updatesFolderPath))
|
||||||
{
|
{
|
||||||
Directory.Delete(updatesFolderPath, true);
|
// Try to delete all files first in case of locking issues
|
||||||
|
foreach (string file in Directory.GetFiles(updatesFolderPath, "*", SearchOption.AllDirectories))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(file);
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Deleted file: {file}");
|
||||||
|
}
|
||||||
|
catch (Exception fileEx)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Could not delete file {file}: {fileEx.Message}", LogHelper.LogType.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then try to delete subdirectories
|
||||||
|
foreach (string dir in Directory.GetDirectories(updatesFolderPath))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(dir, true);
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Deleted directory: {dir}");
|
||||||
|
}
|
||||||
|
catch (Exception dirEx)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Could not delete directory {dir}: {dirEx.Message}", LogHelper.LogType.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally try to delete the main directory
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(updatesFolderPath, true);
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Deleted updates folder: {updatesFolderPath}");
|
||||||
|
}
|
||||||
|
catch (Exception mainDirEx)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Could not completely delete updates folder: {mainDirEx.Message}", LogHelper.LogType.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Updates folder does not exist: {updatesFolderPath}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"AutoUpdate clearing| Error deleting updates folder: {ex.Message}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"AutoUpdate | Error deleting updates folder: {ex.Message}", LogHelper.LogType.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -323,3 +808,4 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -170,7 +170,7 @@
|
|||||||
<Grid x:Name="Main_Grid">
|
<Grid x:Name="Main_Grid">
|
||||||
|
|
||||||
<!--// 设置界面 //-->
|
<!--// 设置界面 //-->
|
||||||
<Grid Panel.ZIndex="999" x:Name="BorderSettingsMask" MouseDown="SettingsOverlayClick" IsHitTestVisible="False"
|
<Grid Panel.ZIndex="999" x:Name="BorderSettingsMask" MouseDown="SettingsOverlayClick" IsHitTestVisible="True"
|
||||||
Margin="0,0,0,0">
|
Margin="0,0,0,0">
|
||||||
<Border Name="BorderSettings" Background="#ee18181b" ui:ThemeManager.RequestedTheme="Dark" Width="490"
|
<Border Name="BorderSettings" Background="#ee18181b" ui:ThemeManager.RequestedTheme="Dark" Width="490"
|
||||||
HorizontalAlignment="Left" Margin="300,150,0,350" Visibility="Visible">
|
HorizontalAlignment="Left" Margin="300,150,0,350" Visibility="Visible">
|
||||||
@@ -2432,7 +2432,7 @@
|
|||||||
<ui:SimpleStackPanel Orientation="Horizontal">
|
<ui:SimpleStackPanel Orientation="Horizontal">
|
||||||
<TextBlock FontSize="18" FontWeight="Bold" Text="Version:" />
|
<TextBlock FontSize="18" FontWeight="Bold" Text="Version:" />
|
||||||
<TextBlock x:Name="AppVersionTextBlock" FontSize="18" FontWeight="Bold"
|
<TextBlock x:Name="AppVersionTextBlock" FontSize="18" FontWeight="Bold"
|
||||||
Text="1.X.X.X" />
|
Text="1.X.X" />
|
||||||
</ui:SimpleStackPanel>
|
</ui:SimpleStackPanel>
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Text="# 使用和分发本软件前,请您应当且务必知晓相关开源协议,且您应当知晓本软件基于 https://github.com/WXRIW/Ink-Canvas 修改而成。"
|
Text="# 使用和分发本软件前,请您应当且务必知晓相关开源协议,且您应当知晓本软件基于 https://github.com/WXRIW/Ink-Canvas 修改而成。"
|
||||||
|
|||||||
+175
-10
@@ -21,6 +21,7 @@ using System.Windows.Input;
|
|||||||
using System.Windows.Data;
|
using System.Windows.Data;
|
||||||
using System.Windows.Documents;
|
using System.Windows.Documents;
|
||||||
using System.Windows.Media.Animation;
|
using System.Windows.Media.Animation;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace Ink_Canvas {
|
namespace Ink_Canvas {
|
||||||
public partial class MainWindow : Window {
|
public partial class MainWindow : Window {
|
||||||
@@ -301,24 +302,169 @@ namespace Ink_Canvas {
|
|||||||
SystemEvents.DisplaySettingsChanged -= SystemEventsOnDisplaySettingsChanged;
|
SystemEvents.DisplaySettingsChanged -= SystemEventsOnDisplaySettingsChanged;
|
||||||
|
|
||||||
LogHelper.WriteLogToFile("Ink Canvas closed", LogHelper.LogType.Event);
|
LogHelper.WriteLogToFile("Ink Canvas closed", LogHelper.LogType.Event);
|
||||||
|
|
||||||
|
// 检查是否有待安装的更新
|
||||||
|
CheckPendingUpdates();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CheckPendingUpdates()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 如果有可用的更新版本且启用了自动更新
|
||||||
|
if (AvailableLatestVersion != null && Settings.Startup.IsAutoUpdate)
|
||||||
|
{
|
||||||
|
// 检查更新文件是否已下载
|
||||||
|
string updatesFolderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "AutoUpdate");
|
||||||
|
string statusFilePath = Path.Combine(updatesFolderPath, $"DownloadV{AvailableLatestVersion}Status.txt");
|
||||||
|
|
||||||
|
if (File.Exists(statusFilePath) && File.ReadAllText(statusFilePath).Trim().ToLower() == "true")
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Installing pending update v{AvailableLatestVersion} on application close");
|
||||||
|
|
||||||
|
// 设置为用户主动退出,避免被看门狗判定为崩溃
|
||||||
|
App.IsAppExitByUser = true;
|
||||||
|
|
||||||
|
// 创建批处理脚本并启动,软件关闭后会执行更新操作
|
||||||
|
AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Error checking pending updates: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void AutoUpdate() {
|
private async void AutoUpdate() {
|
||||||
AvailableLatestVersion = await AutoUpdateHelper.CheckForUpdates();
|
AvailableLatestVersion = await AutoUpdateHelper.CheckForUpdates();
|
||||||
|
|
||||||
if (AvailableLatestVersion != null) {
|
if (AvailableLatestVersion != null) {
|
||||||
var IsDownloadSuccessful = false;
|
// 打开更新提示窗口
|
||||||
IsDownloadSuccessful = await AutoUpdateHelper.DownloadSetupFileAndSaveStatus(AvailableLatestVersion);
|
LogHelper.WriteLogToFile($"AutoUpdate | New version available: {AvailableLatestVersion}");
|
||||||
|
|
||||||
|
// 获取当前版本和发布日期
|
||||||
|
string currentVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||||
|
string releaseDate = DateTime.Now.ToString("yyyy年MM月dd日");
|
||||||
|
|
||||||
|
// 创建更新说明内容(可以从服务器获取或直接在此处设置)
|
||||||
|
string releaseNotes = $@"# InkCanvasForClass v{AvailableLatestVersion}更新
|
||||||
|
|
||||||
|
你好,此次更新包含了一系列新功能和改进:
|
||||||
|
|
||||||
if (IsDownloadSuccessful) {
|
1. 修复了一些已知的bug
|
||||||
if (!Settings.Startup.IsAutoUpdateWithSilence) {
|
2. 优化了程序性能
|
||||||
if (MessageBox.Show("InkCanvasForClass 新版本安装包已下载完成,是否立即更新?",
|
3. 改进了用户界面
|
||||||
"InkCanvasForClass New Version Available", MessageBoxButton.YesNo,
|
4. 添加了新的功能
|
||||||
MessageBoxImage.Question) ==
|
|
||||||
MessageBoxResult.Yes) AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, false);
|
感谢您使用InkCanvasForClass CE!";
|
||||||
} else {
|
|
||||||
timerCheckAutoUpdateWithSilence.Start();
|
// 创建并显示更新窗口
|
||||||
|
HasNewUpdateWindow updateWindow = new HasNewUpdateWindow(currentVersion, AvailableLatestVersion, releaseDate, releaseNotes);
|
||||||
|
bool? dialogResult = updateWindow.ShowDialog();
|
||||||
|
|
||||||
|
// 声明下载结果变量
|
||||||
|
bool isDownloadSuccessful;
|
||||||
|
|
||||||
|
// 如果窗口被关闭但没有点击按钮,视为"稍后更新"
|
||||||
|
if (dialogResult != true) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update dialog closed without selection");
|
||||||
|
|
||||||
|
// 更新自动更新设置并保存
|
||||||
|
Settings.Startup.IsAutoUpdate = updateWindow.IsAutoUpdateEnabled;
|
||||||
|
Settings.Startup.IsAutoUpdateWithSilence = updateWindow.IsSilentUpdateEnabled;
|
||||||
|
SaveSettingsToFile();
|
||||||
|
|
||||||
|
// 如果启用了静默更新,则自动下载更新
|
||||||
|
if (Settings.Startup.IsAutoUpdateWithSilence) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Silent update enabled, downloading update automatically");
|
||||||
|
|
||||||
|
// 静默下载更新
|
||||||
|
isDownloadSuccessful = await AutoUpdateHelper.DownloadSetupFileAndSaveStatus(AvailableLatestVersion);
|
||||||
|
|
||||||
|
if (isDownloadSuccessful) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update downloaded successfully, will install when application closes");
|
||||||
|
|
||||||
|
// 启动检查定时器
|
||||||
|
timerCheckAutoUpdateWithSilence.Start();
|
||||||
|
} else {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Silent update download failed", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新自动更新设置并保存
|
||||||
|
Settings.Startup.IsAutoUpdate = updateWindow.IsAutoUpdateEnabled;
|
||||||
|
Settings.Startup.IsAutoUpdateWithSilence = updateWindow.IsSilentUpdateEnabled;
|
||||||
|
SaveSettingsToFile();
|
||||||
|
|
||||||
|
// 根据用户选择处理更新
|
||||||
|
switch (updateWindow.Result) {
|
||||||
|
case HasNewUpdateWindow.UpdateResult.UpdateNow:
|
||||||
|
// 立即更新:显示下载进度,下载完成后立即安装
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | User chose to update now");
|
||||||
|
|
||||||
|
// 显示下载进度提示
|
||||||
|
MessageBox.Show("开始下载更新,请稍候...", "正在更新", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
|
|
||||||
|
// 下载更新文件
|
||||||
|
isDownloadSuccessful = await AutoUpdateHelper.DownloadSetupFileAndSaveStatus(AvailableLatestVersion);
|
||||||
|
|
||||||
|
if (isDownloadSuccessful) {
|
||||||
|
// 下载成功,提示用户准备安装
|
||||||
|
MessageBoxResult result = MessageBox.Show("更新已下载完成,点击确定后将关闭软件并安装新版本!", "安装更新", MessageBoxButton.OKCancel, MessageBoxImage.Information);
|
||||||
|
|
||||||
|
// 只有当用户点击确定按钮后才关闭软件
|
||||||
|
if (result == MessageBoxResult.OK) {
|
||||||
|
// 设置为用户主动退出,避免被看门狗判定为崩溃
|
||||||
|
App.IsAppExitByUser = true;
|
||||||
|
|
||||||
|
// 准备批处理脚本
|
||||||
|
AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, false);
|
||||||
|
|
||||||
|
// 关闭软件,让安装程序接管
|
||||||
|
Application.Current.Shutdown();
|
||||||
|
} else {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | User cancelled update installation");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 下载失败
|
||||||
|
MessageBox.Show("更新下载失败,请检查网络连接后重试。", "下载失败", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HasNewUpdateWindow.UpdateResult.UpdateLater:
|
||||||
|
// 稍后更新:静默下载,在软件关闭时自动安装
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | User chose to update later");
|
||||||
|
|
||||||
|
// 不管设置如何,都进行下载
|
||||||
|
isDownloadSuccessful = await AutoUpdateHelper.DownloadSetupFileAndSaveStatus(AvailableLatestVersion);
|
||||||
|
|
||||||
|
if (isDownloadSuccessful) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update downloaded successfully, will install when application closes");
|
||||||
|
|
||||||
|
// 设置标志,在应用程序关闭时安装
|
||||||
|
Settings.Startup.IsAutoUpdate = true;
|
||||||
|
Settings.Startup.IsAutoUpdateWithSilence = true;
|
||||||
|
|
||||||
|
// 启动检查定时器
|
||||||
|
timerCheckAutoUpdateWithSilence.Start();
|
||||||
|
|
||||||
|
// 通知用户
|
||||||
|
MessageBox.Show("更新已下载完成,将在软件关闭时自动安装。", "更新已准备就绪", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
|
} else {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update download failed", LogHelper.LogType.Error);
|
||||||
|
MessageBox.Show("更新下载失败,请检查网络连接后重试。", "下载失败", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HasNewUpdateWindow.UpdateResult.SkipVersion:
|
||||||
|
// 跳过该版本:记录到设置中
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | User chose to skip version {AvailableLatestVersion}");
|
||||||
|
// 可以在设置中添加"已跳过的版本"列表
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
AutoUpdateHelper.DeleteUpdatesFolder();
|
AutoUpdateHelper.DeleteUpdatesFolder();
|
||||||
@@ -357,7 +503,22 @@ namespace Ink_Canvas {
|
|||||||
canvas.Cursor = Cursors.Cross;
|
canvas.Cursor = Cursors.Cross;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 确保光标可见,无论是鼠标、触控还是手写笔
|
||||||
System.Windows.Forms.Cursor.Show();
|
System.Windows.Forms.Cursor.Show();
|
||||||
|
|
||||||
|
// 强制应用光标设置
|
||||||
|
canvas.ForceCursor = true;
|
||||||
|
|
||||||
|
// 确保手写笔模式下也能显示光标
|
||||||
|
if (Tablet.TabletDevices.Count > 0) {
|
||||||
|
foreach (TabletDevice device in Tablet.TabletDevices) {
|
||||||
|
if (device.Type == TabletDeviceType.Stylus) {
|
||||||
|
// 手写笔设备存在,强制显示光标
|
||||||
|
System.Windows.Forms.Cursor.Show();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
canvas.UseCustomCursor = false;
|
canvas.UseCustomCursor = false;
|
||||||
canvas.ForceCursor = false;
|
canvas.ForceCursor = false;
|
||||||
@@ -485,7 +646,9 @@ namespace Ink_Canvas {
|
|||||||
{
|
{
|
||||||
// 关闭设置面板
|
// 关闭设置面板
|
||||||
BorderSettings.Visibility = Visibility.Collapsed;
|
BorderSettings.Visibility = Visibility.Collapsed;
|
||||||
|
// 设置蒙版为不可点击,并清除背景
|
||||||
BorderSettingsMask.IsHitTestVisible = false;
|
BorderSettingsMask.IsHitTestVisible = false;
|
||||||
|
BorderSettingsMask.Background = null; // 确保清除蒙层背景
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增:折叠侧边栏
|
// 新增:折叠侧边栏
|
||||||
@@ -518,7 +681,9 @@ namespace Ink_Canvas {
|
|||||||
{
|
{
|
||||||
// 显示设置面板
|
// 显示设置面板
|
||||||
BorderSettings.Visibility = Visibility.Visible;
|
BorderSettings.Visibility = Visibility.Visible;
|
||||||
|
// 设置蒙版为可点击,并添加半透明背景
|
||||||
BorderSettingsMask.IsHitTestVisible = true;
|
BorderSettingsMask.IsHitTestVisible = true;
|
||||||
|
BorderSettingsMask.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(1, 0, 0, 0));
|
||||||
|
|
||||||
// 获取SettingsPanelScrollViewer中的所有GroupBox
|
// 获取SettingsPanelScrollViewer中的所有GroupBox
|
||||||
var stackPanel = SettingsPanelScrollViewer.Content as StackPanel;
|
var stackPanel = SettingsPanelScrollViewer.Content as StackPanel;
|
||||||
|
|||||||
@@ -36,42 +36,10 @@ namespace Ink_Canvas {
|
|||||||
} else {
|
} else {
|
||||||
forceEraser = true;
|
forceEraser = true;
|
||||||
forcePointEraser = true;
|
forcePointEraser = true;
|
||||||
double k = 1;
|
|
||||||
if (Settings.Canvas.EraserShapeType == 0) {
|
// 使用统一的方法应用橡皮擦形状,确保一致性
|
||||||
switch (BoardComboBoxEraserSize.SelectedIndex)
|
ApplyCurrentEraserShape();
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
k = 0.5;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
k = 0.8;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
k = 1.25;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
k = 1.8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
inkCanvas.EraserShape = new EllipseStylusShape(k * 90, k * 90);
|
|
||||||
} else if (Settings.Canvas.EraserShapeType == 1) {
|
|
||||||
switch (BoardComboBoxEraserSize.SelectedIndex)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
k = 0.7;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
k = 0.9;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
k = 1.2;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
k = 1.6;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
inkCanvas.EraserShape = new RectangleStylusShape(k * 90 * 0.6, k * 90);
|
|
||||||
}
|
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
||||||
drawingShapeMode = 0;
|
drawingShapeMode = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -282,6 +282,7 @@ namespace Ink_Canvas {
|
|||||||
AnimationsHelper.HideWithSlideAndFade(BoardBorderRightPageListView);
|
AnimationsHelper.HideWithSlideAndFade(BoardBorderRightPageListView);
|
||||||
|
|
||||||
if (BorderSettings.Visibility == Visibility.Visible) {
|
if (BorderSettings.Visibility == Visibility.Visible) {
|
||||||
|
// 设置蒙版为不可点击,并移除背景
|
||||||
BorderSettingsMask.IsHitTestVisible = false;
|
BorderSettingsMask.IsHitTestVisible = false;
|
||||||
BorderSettingsMask.Background = null;
|
BorderSettingsMask.Background = null;
|
||||||
var sb = new Storyboard();
|
var sb = new Storyboard();
|
||||||
@@ -403,6 +404,11 @@ namespace Ink_Canvas {
|
|||||||
System.Windows.Controls.Canvas.SetLeft(FloatingbarSelectionBG, 28 * 5);
|
System.Windows.Controls.Canvas.SetLeft(FloatingbarSelectionBG, 28 * 5);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "shape": {
|
||||||
|
// 对图形模式进行特殊处理,不修改按钮UI状态
|
||||||
|
// 只隐藏相关面板,但保持图形绘制模式
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1422,44 +1428,9 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
forceEraser = true;
|
forceEraser = true;
|
||||||
forcePointEraser = true;
|
forcePointEraser = true;
|
||||||
if (Settings.Canvas.EraserShapeType == 0) {
|
|
||||||
double k = 1;
|
// 即使手掌触发过面积擦,也强制应用当前的EraserShapeType设置
|
||||||
switch (Settings.Canvas.EraserSize) {
|
ApplyCurrentEraserShape();
|
||||||
case 0:
|
|
||||||
k = 0.5;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
k = 0.8;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
k = 1.25;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
k = 1.8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
inkCanvas.EraserShape = new EllipseStylusShape(k * 90, k * 90);
|
|
||||||
}
|
|
||||||
else if (Settings.Canvas.EraserShapeType == 1) {
|
|
||||||
double k = 1;
|
|
||||||
switch (Settings.Canvas.EraserSize) {
|
|
||||||
case 0:
|
|
||||||
k = 0.7;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
k = 0.9;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
k = 1.2;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
k = 1.6;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
inkCanvas.EraserShape = new RectangleStylusShape(k * 90 * 0.6, k * 90);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) {
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) {
|
||||||
if (EraserSizePanel.Visibility == Visibility.Collapsed) {
|
if (EraserSizePanel.Visibility == Visibility.Collapsed) {
|
||||||
@@ -1498,6 +1469,33 @@ namespace Ink_Canvas {
|
|||||||
inkCanvas_EditingModeChanged(inkCanvas, null);
|
inkCanvas_EditingModeChanged(inkCanvas, null);
|
||||||
CancelSingleFingerDragMode();
|
CancelSingleFingerDragMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 新增方法,根据当前设置应用橡皮擦形状
|
||||||
|
public void ApplyCurrentEraserShape() {
|
||||||
|
double k = 1;
|
||||||
|
switch (Settings.Canvas.EraserSize) {
|
||||||
|
case 0:
|
||||||
|
k = Settings.Canvas.EraserShapeType == 0 ? 0.5 : 0.7;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
k = Settings.Canvas.EraserShapeType == 0 ? 0.8 : 0.9;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
k = Settings.Canvas.EraserShapeType == 0 ? 1.25 : 1.2;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
k = Settings.Canvas.EraserShapeType == 0 ? 1.8 : 1.6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Settings.Canvas.EraserShapeType == 0) {
|
||||||
|
// 圆形擦
|
||||||
|
inkCanvas.EraserShape = new EllipseStylusShape(k * 90, k * 90);
|
||||||
|
} else if (Settings.Canvas.EraserShapeType == 1) {
|
||||||
|
// 矩形黑板擦
|
||||||
|
inkCanvas.EraserShape = new RectangleStylusShape(k * 90 * 0.6, k * 90);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void EraserIconByStrokes_Click(object sender, RoutedEventArgs e) {
|
private void EraserIconByStrokes_Click(object sender, RoutedEventArgs e) {
|
||||||
|
|
||||||
@@ -1549,7 +1547,8 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
private void DrawShapePromptToPen() {
|
private void DrawShapePromptToPen() {
|
||||||
if (isLongPressSelected == true) {
|
if (isLongPressSelected == true) {
|
||||||
HideSubPanels("pen");
|
// 如果是长按选中的状态,只隐藏面板,不切换到笔模式
|
||||||
|
HideSubPanels("shape");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (StackPanelCanvasControls.Visibility == Visibility.Visible)
|
if (StackPanelCanvasControls.Visibility == Visibility.Visible)
|
||||||
@@ -1629,7 +1628,23 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
private void SettingsOverlayClick(object sender, MouseButtonEventArgs e) {
|
private void SettingsOverlayClick(object sender, MouseButtonEventArgs e) {
|
||||||
if (isOpeningOrHidingSettingsPane == true) return;
|
if (isOpeningOrHidingSettingsPane == true) return;
|
||||||
BtnSettings_Click(null, null);
|
|
||||||
|
// 获取点击的位置
|
||||||
|
Point clickPoint = e.GetPosition(BorderSettingsMask);
|
||||||
|
|
||||||
|
// 获取BorderSettings的位置和大小
|
||||||
|
Point settingsPosition = BorderSettings.TranslatePoint(new Point(0, 0), BorderSettingsMask);
|
||||||
|
Rect settingsRect = new Rect(
|
||||||
|
settingsPosition.X,
|
||||||
|
settingsPosition.Y,
|
||||||
|
BorderSettings.ActualWidth,
|
||||||
|
BorderSettings.ActualHeight
|
||||||
|
);
|
||||||
|
|
||||||
|
// 如果点击位置不在设置界面内部,才关闭设置界面
|
||||||
|
if (!settingsRect.Contains(clickPoint)) {
|
||||||
|
BtnSettings_Click(null, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool isOpeningOrHidingSettingsPane = false;
|
private bool isOpeningOrHidingSettingsPane = false;
|
||||||
@@ -1639,6 +1654,7 @@ namespace Ink_Canvas {
|
|||||||
HideSubPanels();
|
HideSubPanels();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// 设置蒙版为可点击,并添加半透明背景
|
||||||
BorderSettingsMask.IsHitTestVisible = true;
|
BorderSettingsMask.IsHitTestVisible = true;
|
||||||
BorderSettingsMask.Background = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0));
|
BorderSettingsMask.Background = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0));
|
||||||
SettingsPanelScrollViewer.ScrollToTop();
|
SettingsPanelScrollViewer.ScrollToTop();
|
||||||
|
|||||||
@@ -792,46 +792,17 @@ namespace Ink_Canvas {
|
|||||||
ComboBoxEraserSizeFloatingBar.SelectedIndex = s.SelectedIndex;
|
ComboBoxEraserSizeFloatingBar.SelectedIndex = s.SelectedIndex;
|
||||||
ComboBoxEraserSize.SelectedIndex = s.SelectedIndex;
|
ComboBoxEraserSize.SelectedIndex = s.SelectedIndex;
|
||||||
}
|
}
|
||||||
if (Settings.Canvas.EraserShapeType == 0) {
|
|
||||||
double k = 1;
|
// 使用统一的方法应用橡皮擦形状
|
||||||
switch (s.SelectedIndex) {
|
ApplyCurrentEraserShape();
|
||||||
case 0:
|
|
||||||
k = 0.5;
|
// 确保当前处于橡皮擦模式时能立即看到效果
|
||||||
break;
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) {
|
||||||
case 1:
|
// 先切换一下模式,再切回来,确保橡皮擦形状得到刷新
|
||||||
k = 0.8;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
break;
|
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
||||||
case 3:
|
|
||||||
k = 1.25;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
k = 1.8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
inkCanvas.EraserShape = new EllipseStylusShape(k * 90, k * 90);
|
|
||||||
} else if (Settings.Canvas.EraserShapeType == 1) {
|
|
||||||
double k = 1;
|
|
||||||
switch (s.SelectedIndex) {
|
|
||||||
case 0:
|
|
||||||
k = 0.7;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
k = 0.9;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
k = 1.2;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
k = 1.6;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
inkCanvas.EraserShape = new RectangleStylusShape(k * 90 * 0.6, k * 90);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
|
||||||
SaveSettingsToFile();
|
SaveSettingsToFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -840,23 +811,11 @@ namespace Ink_Canvas {
|
|||||||
Settings.Canvas.EraserShapeType = 0;
|
Settings.Canvas.EraserShapeType = 0;
|
||||||
SaveSettingsToFile();
|
SaveSettingsToFile();
|
||||||
CheckEraserTypeTab();
|
CheckEraserTypeTab();
|
||||||
double k = 1;
|
|
||||||
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex) {
|
// 使用统一的方法应用橡皮擦形状
|
||||||
case 0:
|
ApplyCurrentEraserShape();
|
||||||
k = 0.5;
|
|
||||||
break;
|
// 确保当前处于橡皮擦模式时能立即看到效果
|
||||||
case 1:
|
|
||||||
k = 0.8;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
k = 1.25;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
k = 1.8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
inkCanvas.EraserShape = new EllipseStylusShape(k * 90, k * 90);
|
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
||||||
}
|
}
|
||||||
@@ -866,23 +825,11 @@ namespace Ink_Canvas {
|
|||||||
Settings.Canvas.EraserShapeType = 1;
|
Settings.Canvas.EraserShapeType = 1;
|
||||||
SaveSettingsToFile();
|
SaveSettingsToFile();
|
||||||
CheckEraserTypeTab();
|
CheckEraserTypeTab();
|
||||||
double k = 1;
|
|
||||||
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex) {
|
// 使用统一的方法应用橡皮擦形状
|
||||||
case 0:
|
ApplyCurrentEraserShape();
|
||||||
k = 0.7;
|
|
||||||
break;
|
// 确保当前处于橡皮擦模式时能立即看到效果
|
||||||
case 1:
|
|
||||||
k = 0.9;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
k = 1.2;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
k = 1.6;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
inkCanvas.EraserShape = new RectangleStylusShape(k * 90 * 0.6, k * 90);
|
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
||||||
}
|
}
|
||||||
@@ -1347,29 +1294,52 @@ namespace Ink_Canvas {
|
|||||||
BoardToggleSwitchEnableMultiTouchMode.IsOn = ToggleSwitchEnableMultiTouchMode.IsOn;
|
BoardToggleSwitchEnableMultiTouchMode.IsOn = ToggleSwitchEnableMultiTouchMode.IsOn;
|
||||||
else
|
else
|
||||||
ToggleSwitchEnableMultiTouchMode.IsOn = BoardToggleSwitchEnableMultiTouchMode.IsOn;
|
ToggleSwitchEnableMultiTouchMode.IsOn = BoardToggleSwitchEnableMultiTouchMode.IsOn;
|
||||||
|
|
||||||
if (ToggleSwitchEnableMultiTouchMode.IsOn) {
|
if (ToggleSwitchEnableMultiTouchMode.IsOn) {
|
||||||
if (!isInMultiTouchMode) {
|
if (!isInMultiTouchMode) {
|
||||||
|
// 保存当前编辑模式和绘图工具状态
|
||||||
|
InkCanvasEditingMode currentEditingMode = inkCanvas.EditingMode;
|
||||||
|
int currentDrawingShapeMode = drawingShapeMode;
|
||||||
|
bool currentForceEraser = forceEraser;
|
||||||
|
|
||||||
inkCanvas.StylusDown += MainWindow_StylusDown;
|
inkCanvas.StylusDown += MainWindow_StylusDown;
|
||||||
inkCanvas.StylusMove += MainWindow_StylusMove;
|
inkCanvas.StylusMove += MainWindow_StylusMove;
|
||||||
inkCanvas.StylusUp += MainWindow_StylusUp;
|
inkCanvas.StylusUp += MainWindow_StylusUp;
|
||||||
inkCanvas.TouchDown += MainWindow_TouchDown;
|
inkCanvas.TouchDown += MainWindow_TouchDown;
|
||||||
inkCanvas.TouchDown -= Main_Grid_TouchDown;
|
inkCanvas.TouchDown -= Main_Grid_TouchDown;
|
||||||
|
|
||||||
|
// 先设为None再设回原来的模式,避免可能的事件冲突
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
|
||||||
inkCanvas.Children.Clear();
|
inkCanvas.Children.Clear();
|
||||||
isInMultiTouchMode = true;
|
isInMultiTouchMode = true;
|
||||||
|
|
||||||
|
// 恢复到之前的编辑状态
|
||||||
|
inkCanvas.EditingMode = currentEditingMode;
|
||||||
|
drawingShapeMode = currentDrawingShapeMode;
|
||||||
|
forceEraser = currentForceEraser;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isInMultiTouchMode) {
|
if (isInMultiTouchMode) {
|
||||||
|
// 保存当前编辑模式和绘图工具状态
|
||||||
|
InkCanvasEditingMode currentEditingMode = inkCanvas.EditingMode;
|
||||||
|
int currentDrawingShapeMode = drawingShapeMode;
|
||||||
|
bool currentForceEraser = forceEraser;
|
||||||
|
|
||||||
inkCanvas.StylusDown -= MainWindow_StylusDown;
|
inkCanvas.StylusDown -= MainWindow_StylusDown;
|
||||||
inkCanvas.StylusMove -= MainWindow_StylusMove;
|
inkCanvas.StylusMove -= MainWindow_StylusMove;
|
||||||
inkCanvas.StylusUp -= MainWindow_StylusUp;
|
inkCanvas.StylusUp -= MainWindow_StylusUp;
|
||||||
inkCanvas.TouchDown -= MainWindow_TouchDown;
|
inkCanvas.TouchDown -= MainWindow_TouchDown;
|
||||||
inkCanvas.TouchDown += Main_Grid_TouchDown;
|
inkCanvas.TouchDown += Main_Grid_TouchDown;
|
||||||
|
|
||||||
|
// 先设为None再设回原来的模式,避免可能的事件冲突
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
|
||||||
inkCanvas.Children.Clear();
|
inkCanvas.Children.Clear();
|
||||||
isInMultiTouchMode = false;
|
isInMultiTouchMode = false;
|
||||||
|
|
||||||
|
// 恢复到之前的编辑状态
|
||||||
|
inkCanvas.EditingMode = currentEditingMode;
|
||||||
|
drawingShapeMode = currentDrawingShapeMode;
|
||||||
|
forceEraser = currentForceEraser;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,8 +70,17 @@ namespace Ink_Canvas {
|
|||||||
BoundsWidth = Settings.Advanced.FingerModeBoundsWidth;
|
BoundsWidth = Settings.Advanced.FingerModeBoundsWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Settings.Startup.IsAutoUpdate) {
|
// Always show update setting in UI based on stored preference
|
||||||
ToggleSwitchIsAutoUpdate.IsOn = true;
|
ToggleSwitchIsAutoUpdate.IsOn = Settings.Startup.IsAutoUpdate;
|
||||||
|
|
||||||
|
// Always check for updates at startup, regardless of the setting
|
||||||
|
if (isStartup) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Running auto-update check at startup");
|
||||||
|
AutoUpdate();
|
||||||
|
}
|
||||||
|
// Call auto-update when setting is changed (not at startup)
|
||||||
|
else if (Settings.Startup.IsAutoUpdate) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Running auto-update check after settings change");
|
||||||
AutoUpdate();
|
AutoUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -510,6 +519,8 @@ namespace Ink_Canvas {
|
|||||||
// 初始化直线自动拉直相关设置
|
// 初始化直线自动拉直相关设置
|
||||||
ToggleSwitchAutoStraightenLine.IsOn = Settings.Canvas.AutoStraightenLine;
|
ToggleSwitchAutoStraightenLine.IsOn = Settings.Canvas.AutoStraightenLine;
|
||||||
AutoStraightenLineThresholdSlider.Value = Settings.Canvas.AutoStraightenLineThreshold;
|
AutoStraightenLineThresholdSlider.Value = Settings.Canvas.AutoStraightenLineThreshold;
|
||||||
|
// 直线拉直灵敏度也在这里初始化,即使它存储在InkToShape中
|
||||||
|
LineStraightenSensitivitySlider.Value = Settings.InkToShape.LineStraightenSensitivity;
|
||||||
|
|
||||||
// 初始化直线端点吸附相关设置
|
// 初始化直线端点吸附相关设置
|
||||||
ToggleSwitchLineEndpointSnapping.IsOn = Settings.Canvas.LineEndpointSnapping;
|
ToggleSwitchLineEndpointSnapping.IsOn = Settings.Canvas.LineEndpointSnapping;
|
||||||
@@ -579,8 +590,7 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
ToggleCheckboxEnableInkToShapeRounded.IsChecked = Settings.InkToShape.IsInkToShapeRounded;
|
ToggleCheckboxEnableInkToShapeRounded.IsChecked = Settings.InkToShape.IsInkToShapeRounded;
|
||||||
|
|
||||||
// 初始化直线拉直灵敏度
|
// 直线拉直灵敏度在Canvas部分已经初始化,这里不再重复
|
||||||
LineStraightenSensitivitySlider.Value = Settings.InkToShape.LineStraightenSensitivity;
|
|
||||||
} else {
|
} else {
|
||||||
Settings.InkToShape = new InkToShape();
|
Settings.InkToShape = new InkToShape();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,16 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
private Task<bool> CheckIsDrawingShapesInMultiTouchMode() {
|
private Task<bool> CheckIsDrawingShapesInMultiTouchMode() {
|
||||||
if (isInMultiTouchMode) {
|
if (isInMultiTouchMode) {
|
||||||
ToggleSwitchEnableMultiTouchMode.IsOn = false;
|
// 不关闭多指书写模式,而是保存状态,暂时禁用多指书写相关的事件处理
|
||||||
|
// 不再调用 ToggleSwitchEnableMultiTouchMode.IsOn = false;
|
||||||
|
|
||||||
|
// 暂时禁用多指书写事件处理,以避免冲突
|
||||||
|
inkCanvas.StylusDown -= MainWindow_StylusDown;
|
||||||
|
inkCanvas.StylusMove -= MainWindow_StylusMove;
|
||||||
|
inkCanvas.StylusUp -= MainWindow_StylusUp;
|
||||||
|
inkCanvas.TouchDown -= MainWindow_TouchDown;
|
||||||
|
|
||||||
|
// 记录已暂时禁用多指书写模式,但实际上多指书写开关仍然为打开状态
|
||||||
lastIsInMultiTouchMode = true;
|
lastIsInMultiTouchMode = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,6 +138,14 @@ namespace Ink_Canvas {
|
|||||||
inkCanvas.IsManipulationEnabled = true;
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
CancelSingleFingerDragMode();
|
CancelSingleFingerDragMode();
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// 即使不是长按,也设置必要的绘图状态
|
||||||
|
forceEraser = true;
|
||||||
|
drawingShapeMode = 1;
|
||||||
|
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||||
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
|
isLongPressSelected = true; // 设置为选中状态,避免抬笔后切换回笔模式
|
||||||
|
}
|
||||||
|
|
||||||
lastMouseDownSender = null;
|
lastMouseDownSender = null;
|
||||||
if (isLongPressSelected) {
|
if (isLongPressSelected) {
|
||||||
@@ -189,6 +206,14 @@ namespace Ink_Canvas {
|
|||||||
inkCanvas.IsManipulationEnabled = true;
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
CancelSingleFingerDragMode();
|
CancelSingleFingerDragMode();
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// 即使不是长按,也设置必要的绘图状态
|
||||||
|
forceEraser = true;
|
||||||
|
drawingShapeMode = 2;
|
||||||
|
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||||
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
|
isLongPressSelected = true; // 设置为选中状态,避免抬笔后切换回笔模式
|
||||||
|
}
|
||||||
|
|
||||||
lastMouseDownSender = null;
|
lastMouseDownSender = null;
|
||||||
if (isLongPressSelected) {
|
if (isLongPressSelected) {
|
||||||
@@ -276,6 +301,7 @@ namespace Ink_Canvas {
|
|||||||
drawingShapeMode = 3;
|
drawingShapeMode = 3;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||||
inkCanvas.IsManipulationEnabled = true;
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
|
isLongPressSelected = true; // 设置为选中状态,避免抬笔后切换回笔模式
|
||||||
CancelSingleFingerDragMode();
|
CancelSingleFingerDragMode();
|
||||||
DrawShapePromptToPen();
|
DrawShapePromptToPen();
|
||||||
}
|
}
|
||||||
@@ -435,7 +461,12 @@ namespace Ink_Canvas {
|
|||||||
if (isLastTouchEraser) return;
|
if (isLastTouchEraser) return;
|
||||||
//EraserContainer.Background = null;
|
//EraserContainer.Background = null;
|
||||||
//ImageEraser.Visibility = Visibility.Visible;
|
//ImageEraser.Visibility = Visibility.Visible;
|
||||||
if (isWaitUntilNextTouchDown) return;
|
|
||||||
|
// 修复触屏状态下几何绘制功能不可用的问题
|
||||||
|
// 在几何绘制模式下,即使isWaitUntilNextTouchDown为true,也应该处理触摸移动事件
|
||||||
|
// 只有当多点触控时才需要等待下一次触摸
|
||||||
|
if (isWaitUntilNextTouchDown && dec.Count > 1) return;
|
||||||
|
|
||||||
if (dec.Count > 1) {
|
if (dec.Count > 1) {
|
||||||
isWaitUntilNextTouchDown = true;
|
isWaitUntilNextTouchDown = true;
|
||||||
try {
|
try {
|
||||||
@@ -447,6 +478,11 @@ namespace Ink_Canvas {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 在几何绘制模式下,确保处理单点触控的移动事件
|
||||||
|
Point touchPoint = e.GetTouchPoint(inkCanvas).Position;
|
||||||
|
MouseTouchMove(touchPoint);
|
||||||
|
return; // 处理完几何绘制后直接返回,不执行后面的代码
|
||||||
}
|
}
|
||||||
|
|
||||||
// 触摸移动时保持自定义光标显示
|
// 触摸移动时保持自定义光标显示
|
||||||
@@ -1346,8 +1382,34 @@ namespace Ink_Canvas {
|
|||||||
ViewboxFloatingBar.IsHitTestVisible = true;
|
ViewboxFloatingBar.IsHitTestVisible = true;
|
||||||
BlackboardUIGridForInkReplay.IsHitTestVisible = true;
|
BlackboardUIGridForInkReplay.IsHitTestVisible = true;
|
||||||
|
|
||||||
|
// 在几何绘制模式下,确保正确处理触摸抬起事件
|
||||||
|
if (drawingShapeMode != 0) {
|
||||||
|
// 如果是几何绘制模式,确保将临时绘制的图形添加到永久图形中
|
||||||
|
if (lastTempStroke != null) {
|
||||||
|
// 将临时笔画添加到历史记录中
|
||||||
|
var strokes = new StrokeCollection();
|
||||||
|
strokes.Add(lastTempStroke);
|
||||||
|
timeMachine.CommitStrokeUserInputHistory(strokes);
|
||||||
|
// 清除临时笔画引用,以便下次绘制
|
||||||
|
lastTempStroke = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastTempStrokeCollection != null && lastTempStrokeCollection.Count > 0) {
|
||||||
|
// 将临时笔画集合添加到历史记录中
|
||||||
|
timeMachine.CommitStrokeUserInputHistory(lastTempStrokeCollection);
|
||||||
|
// 清除临时笔画集合引用,以便下次绘制
|
||||||
|
lastTempStrokeCollection = new StrokeCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果不是长按选中的状态,则需要在抬起手指后重置isWaitUntilNextTouchDown
|
||||||
|
if (!isLongPressSelected && dec.Count == 0) {
|
||||||
|
isWaitUntilNextTouchDown = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inkCanvas_MouseUp(sender, null);
|
inkCanvas_MouseUp(sender, null);
|
||||||
if (dec.Count == 0) isWaitUntilNextTouchDown = false;
|
// 修改此处逻辑,在长按选择图形模式下保持isWaitUntilNextTouchDown
|
||||||
|
if (dec.Count == 0 && !isLongPressSelected) isWaitUntilNextTouchDown = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Stroke lastTempStroke = null;
|
private Stroke lastTempStroke = null;
|
||||||
@@ -1537,17 +1599,37 @@ namespace Ink_Canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lastIsInMultiTouchMode) {
|
if (lastIsInMultiTouchMode) {
|
||||||
ToggleSwitchEnableMultiTouchMode.IsOn = true;
|
// 不再重新启用开关,而是恢复多指书写相关的事件处理
|
||||||
|
// ToggleSwitchEnableMultiTouchMode.IsOn = true;
|
||||||
|
|
||||||
|
// 恢复多指书写事件处理
|
||||||
|
inkCanvas.StylusDown += MainWindow_StylusDown;
|
||||||
|
inkCanvas.StylusMove += MainWindow_StylusMove;
|
||||||
|
inkCanvas.StylusUp += MainWindow_StylusUp;
|
||||||
|
inkCanvas.TouchDown += MainWindow_TouchDown;
|
||||||
|
|
||||||
lastIsInMultiTouchMode = false;
|
lastIsInMultiTouchMode = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 修改此处逻辑,确保在正确的情况下才切换回笔模式
|
||||||
if (drawingShapeMode != 9 && drawingShapeMode != 0 && drawingShapeMode != 24 && drawingShapeMode != 25) {
|
if (drawingShapeMode != 9 && drawingShapeMode != 0 && drawingShapeMode != 24 && drawingShapeMode != 25) {
|
||||||
if (isLongPressSelected) { }
|
if (isLongPressSelected) {
|
||||||
|
// 如果是长按选中的情况,保持图形模式,不做任何切换
|
||||||
|
isWaitUntilNextTouchDown = true; // 保持当前绘图模式直到下一次触摸
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
BtnPen_Click(null, null); //画完一次还原到笔模式
|
BtnPen_Click(null, null); //画完一次还原到笔模式
|
||||||
if (lastIsInMultiTouchMode) {
|
if (lastIsInMultiTouchMode) {
|
||||||
ToggleSwitchEnableMultiTouchMode.IsOn = true;
|
// 不再重新启用开关,而是恢复多指书写相关的事件处理
|
||||||
|
// ToggleSwitchEnableMultiTouchMode.IsOn = true;
|
||||||
|
|
||||||
|
// 恢复多指书写事件处理
|
||||||
|
inkCanvas.StylusDown += MainWindow_StylusDown;
|
||||||
|
inkCanvas.StylusMove += MainWindow_StylusMove;
|
||||||
|
inkCanvas.StylusUp += MainWindow_StylusUp;
|
||||||
|
inkCanvas.TouchDown += MainWindow_TouchDown;
|
||||||
|
|
||||||
lastIsInMultiTouchMode = false;
|
lastIsInMultiTouchMode = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1573,7 +1655,15 @@ namespace Ink_Canvas {
|
|||||||
else {
|
else {
|
||||||
BtnPen_Click(null, null); //画完还原到笔模式
|
BtnPen_Click(null, null); //画完还原到笔模式
|
||||||
if (lastIsInMultiTouchMode) {
|
if (lastIsInMultiTouchMode) {
|
||||||
ToggleSwitchEnableMultiTouchMode.IsOn = true;
|
// 不再重新启用开关,而是恢复多指书写相关的事件处理
|
||||||
|
// ToggleSwitchEnableMultiTouchMode.IsOn = true;
|
||||||
|
|
||||||
|
// 恢复多指书写事件处理
|
||||||
|
inkCanvas.StylusDown += MainWindow_StylusDown;
|
||||||
|
inkCanvas.StylusMove += MainWindow_StylusMove;
|
||||||
|
inkCanvas.StylusUp += MainWindow_StylusUp;
|
||||||
|
inkCanvas.TouchDown += MainWindow_TouchDown;
|
||||||
|
|
||||||
lastIsInMultiTouchMode = false;
|
lastIsInMultiTouchMode = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1619,7 +1709,15 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
BtnPen_Click(null, null); //画完还原到笔模式
|
BtnPen_Click(null, null); //画完还原到笔模式
|
||||||
if (lastIsInMultiTouchMode) {
|
if (lastIsInMultiTouchMode) {
|
||||||
ToggleSwitchEnableMultiTouchMode.IsOn = true;
|
// 不再重新启用开关,而是恢复多指书写相关的事件处理
|
||||||
|
// ToggleSwitchEnableMultiTouchMode.IsOn = true;
|
||||||
|
|
||||||
|
// 恢复多指书写事件处理
|
||||||
|
inkCanvas.StylusDown += MainWindow_StylusDown;
|
||||||
|
inkCanvas.StylusMove += MainWindow_StylusMove;
|
||||||
|
inkCanvas.StylusUp += MainWindow_StylusUp;
|
||||||
|
inkCanvas.TouchDown += MainWindow_TouchDown;
|
||||||
|
|
||||||
lastIsInMultiTouchMode = false;
|
lastIsInMultiTouchMode = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ namespace Ink_Canvas {
|
|||||||
public partial class MainWindow : Window {
|
public partial class MainWindow : Window {
|
||||||
private StrokeCollection newStrokes = new StrokeCollection();
|
private StrokeCollection newStrokes = new StrokeCollection();
|
||||||
private List<Circle> circles = new List<Circle>();
|
private List<Circle> circles = new List<Circle>();
|
||||||
private const double SNAP_THRESHOLD = 15.0; // Distance threshold for endpoint snapping
|
|
||||||
private const double LINE_STRAIGHTEN_THRESHOLD = 0.10; // 降低阈值,让直线检测更严格
|
private const double LINE_STRAIGHTEN_THRESHOLD = 0.10; // 降低阈值,让直线检测更严格
|
||||||
|
|
||||||
private void inkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) {
|
private void inkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) {
|
||||||
@@ -120,25 +119,34 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
// Apply line straightening and endpoint snapping if ink-to-shape is enabled
|
// Apply line straightening and endpoint snapping if ink-to-shape is enabled
|
||||||
if (Settings.InkToShape.IsInkToShapeEnabled) {
|
if (Settings.InkToShape.IsInkToShapeEnabled) {
|
||||||
// Check if this stroke could be a straight line
|
// 检查是否启用了直线自动拉直功能
|
||||||
if (IsPotentialStraightLine(e.Stroke)) {
|
if (Settings.Canvas.AutoStraightenLine && IsPotentialStraightLine(e.Stroke)) {
|
||||||
// Get start and end points of the stroke
|
// Get start and end points of the stroke
|
||||||
Point startPoint = e.Stroke.StylusPoints[0].ToPoint();
|
Point startPoint = e.Stroke.StylusPoints[0].ToPoint();
|
||||||
Point endPoint = e.Stroke.StylusPoints[e.Stroke.StylusPoints.Count - 1].ToPoint();
|
Point endPoint = e.Stroke.StylusPoints[e.Stroke.StylusPoints.Count - 1].ToPoint();
|
||||||
|
|
||||||
// Try to snap endpoints to existing strokes
|
// 端点吸附和直线拉直完全分离处理
|
||||||
bool snapped = false;
|
bool snapped = false;
|
||||||
if (Settings.InkToShape.IsInkToShapeRectangle || Settings.InkToShape.IsInkToShapeTriangle) {
|
|
||||||
Point[] snappedPoints = GetSnappedEndpoints(startPoint, endPoint);
|
// 只有在启用端点吸附时才尝试吸附
|
||||||
if (snappedPoints != null) {
|
if (Settings.Canvas.LineEndpointSnapping) {
|
||||||
startPoint = snappedPoints[0];
|
// 只有在启用了形状识别(矩形或三角形)时才执行端点吸附
|
||||||
endPoint = snappedPoints[1];
|
if (Settings.InkToShape.IsInkToShapeRectangle || Settings.InkToShape.IsInkToShapeTriangle) {
|
||||||
snapped = true;
|
Point[] snappedPoints = GetSnappedEndpoints(startPoint, endPoint);
|
||||||
|
if (snappedPoints != null) {
|
||||||
|
startPoint = snappedPoints[0];
|
||||||
|
endPoint = snappedPoints[1];
|
||||||
|
snapped = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create straight line stroke
|
// 独立检查是否应该拉直线条,无论端点吸附是否启用或成功
|
||||||
if (snapped || ShouldStraightenLine(e.Stroke)) {
|
bool shouldStraighten = ShouldStraightenLine(e.Stroke);
|
||||||
|
|
||||||
|
// 如果满足任一条件(吸附成功或应该拉直),则创建直线
|
||||||
|
// 这里的条件是"或"关系,只要有一个条件满足就会创建直线
|
||||||
|
if (snapped || shouldStraighten) {
|
||||||
StylusPointCollection straightLinePoints = CreateStraightLine(startPoint, endPoint);
|
StylusPointCollection straightLinePoints = CreateStraightLine(startPoint, endPoint);
|
||||||
Stroke straightStroke = new Stroke(straightLinePoints) {
|
Stroke straightStroke = new Stroke(straightLinePoints) {
|
||||||
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
||||||
@@ -574,8 +582,8 @@ namespace Ink_Canvas {
|
|||||||
Point end = stroke.StylusPoints.Last().ToPoint();
|
Point end = stroke.StylusPoints.Last().ToPoint();
|
||||||
double lineLength = GetDistance(start, end);
|
double lineLength = GetDistance(start, end);
|
||||||
|
|
||||||
// 线条必须足够长才考虑拉直,至少30像素
|
// 线条必须足够长才考虑拉直,使用设置中的阈值
|
||||||
if (lineLength < 30)
|
if (lineLength < Settings.Canvas.AutoStraightenLineThreshold)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// 获取用户设置的灵敏度值
|
// 获取用户设置的灵敏度值
|
||||||
@@ -620,8 +628,8 @@ namespace Ink_Canvas {
|
|||||||
double maxDeviation = 0;
|
double maxDeviation = 0;
|
||||||
double lineLength = GetDistance(start, end);
|
double lineLength = GetDistance(start, end);
|
||||||
|
|
||||||
// 如果线条太短,不进行拉直处理
|
// 如果线条太短,不进行拉直处理,使用设置中的阈值
|
||||||
if (lineLength < 50) {
|
if (lineLength < Settings.Canvas.AutoStraightenLineThreshold) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -682,14 +690,32 @@ namespace Ink_Canvas {
|
|||||||
private StylusPointCollection CreateStraightLine(Point start, Point end) {
|
private StylusPointCollection CreateStraightLine(Point start, Point end) {
|
||||||
StylusPointCollection points = new StylusPointCollection();
|
StylusPointCollection points = new StylusPointCollection();
|
||||||
|
|
||||||
// Create a more natural pressure profile for the line
|
// 根据是否启用压感触屏模式决定如何设置压感
|
||||||
if (Settings.InkToShape.IsInkToShapeNoFakePressureRectangle == true || penType == 1) {
|
// 如果未启用压感触屏模式,则使用均匀粗细
|
||||||
points.Add(new StylusPoint(start.X, start.Y));
|
if (!Settings.Canvas.EnablePressureTouchMode || Settings.Canvas.DisablePressure ||
|
||||||
points.Add(new StylusPoint(end.X, end.Y));
|
Settings.InkToShape.IsInkToShapeNoFakePressureRectangle == true || penType == 1) {
|
||||||
|
// 使用均匀粗细(所有点压感值都是0.5f)
|
||||||
|
points.Add(new StylusPoint(start.X, start.Y, 0.5f));
|
||||||
|
|
||||||
|
// 可以添加一些额外的中间点使线条更平滑(均匀粗细)
|
||||||
|
double distance = GetDistance(start, end);
|
||||||
|
if (distance > 100) {
|
||||||
|
// 对于较长的线条,添加几个中间点
|
||||||
|
for (int i = 1; i < 3; i++) {
|
||||||
|
double ratio = i / 3.0;
|
||||||
|
Point midPoint = new Point(
|
||||||
|
start.X + (end.X - start.X) * ratio,
|
||||||
|
start.Y + (end.Y - start.Y) * ratio);
|
||||||
|
points.Add(new StylusPoint(midPoint.X, midPoint.Y, 0.5f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
points.Add(new StylusPoint(end.X, end.Y, 0.5f));
|
||||||
} else {
|
} else {
|
||||||
|
// 启用了压感触屏模式,使用变化的粗细(原有行为)
|
||||||
points.Add(new StylusPoint(start.X, start.Y, 0.4f));
|
points.Add(new StylusPoint(start.X, start.Y, 0.4f));
|
||||||
|
|
||||||
// Add a middle point with higher pressure
|
// 添加中点,压感值较高,使线条中间较粗
|
||||||
Point midPoint = new Point((start.X + end.X) / 2, (start.Y + end.Y) / 2);
|
Point midPoint = new Point((start.X + end.X) / 2, (start.Y + end.Y) / 2);
|
||||||
points.Add(new StylusPoint(midPoint.X, midPoint.Y, 0.8f));
|
points.Add(new StylusPoint(midPoint.X, midPoint.Y, 0.8f));
|
||||||
|
|
||||||
@@ -714,11 +740,19 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
// New method: Attempts to snap endpoints to existing stroke endpoints
|
// New method: Attempts to snap endpoints to existing stroke endpoints
|
||||||
private Point[] GetSnappedEndpoints(Point start, Point end) {
|
private Point[] GetSnappedEndpoints(Point start, Point end) {
|
||||||
|
// 如果端点吸附功能关闭,直接返回null
|
||||||
|
// 这里不再返回原始点,因为调用此方法的地方会判断返回值是否为null
|
||||||
|
if (!Settings.Canvas.LineEndpointSnapping)
|
||||||
|
return null;
|
||||||
|
|
||||||
bool startSnapped = false;
|
bool startSnapped = false;
|
||||||
bool endSnapped = false;
|
bool endSnapped = false;
|
||||||
Point snappedStart = start;
|
Point snappedStart = start;
|
||||||
Point snappedEnd = end;
|
Point snappedEnd = end;
|
||||||
|
|
||||||
|
// 使用设置中的吸附距离阈值
|
||||||
|
double snapThreshold = Settings.Canvas.LineEndpointSnappingThreshold;
|
||||||
|
|
||||||
// Check all strokes in canvas for potential snap points
|
// Check all strokes in canvas for potential snap points
|
||||||
foreach (Stroke stroke in inkCanvas.Strokes) {
|
foreach (Stroke stroke in inkCanvas.Strokes) {
|
||||||
if (stroke.StylusPoints.Count == 0) continue;
|
if (stroke.StylusPoints.Count == 0) continue;
|
||||||
@@ -729,10 +763,10 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
// Check if start point should snap to an endpoint
|
// Check if start point should snap to an endpoint
|
||||||
if (!startSnapped) {
|
if (!startSnapped) {
|
||||||
if (GetDistance(start, strokeStart) < SNAP_THRESHOLD) {
|
if (GetDistance(start, strokeStart) < snapThreshold) {
|
||||||
snappedStart = strokeStart;
|
snappedStart = strokeStart;
|
||||||
startSnapped = true;
|
startSnapped = true;
|
||||||
} else if (GetDistance(start, strokeEnd) < SNAP_THRESHOLD) {
|
} else if (GetDistance(start, strokeEnd) < snapThreshold) {
|
||||||
snappedStart = strokeEnd;
|
snappedStart = strokeEnd;
|
||||||
startSnapped = true;
|
startSnapped = true;
|
||||||
}
|
}
|
||||||
@@ -740,10 +774,10 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
// Check if end point should snap to an endpoint
|
// Check if end point should snap to an endpoint
|
||||||
if (!endSnapped) {
|
if (!endSnapped) {
|
||||||
if (GetDistance(end, strokeStart) < SNAP_THRESHOLD) {
|
if (GetDistance(end, strokeStart) < snapThreshold) {
|
||||||
snappedEnd = strokeStart;
|
snappedEnd = strokeStart;
|
||||||
endSnapped = true;
|
endSnapped = true;
|
||||||
} else if (GetDistance(end, strokeEnd) < SNAP_THRESHOLD) {
|
} else if (GetDistance(end, strokeEnd) < snapThreshold) {
|
||||||
snappedEnd = strokeEnd;
|
snappedEnd = strokeEnd;
|
||||||
endSnapped = true;
|
endSnapped = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ using System.Runtime.CompilerServices;
|
|||||||
using System.Timers;
|
using System.Timers;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using MessageBox = System.Windows.MessageBox;
|
using MessageBox = System.Windows.MessageBox;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ink_Canvas {
|
namespace Ink_Canvas {
|
||||||
public class TimeViewModel : INotifyPropertyChanged {
|
public class TimeViewModel : INotifyPropertyChanged {
|
||||||
@@ -302,24 +305,102 @@ namespace Ink_Canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void timerCheckAutoUpdateWithSilence_Elapsed(object sender, ElapsedEventArgs e) {
|
private void timerCheckAutoUpdateWithSilence_Elapsed(object sender, ElapsedEventArgs e) {
|
||||||
Dispatcher.Invoke(() => {
|
// 停止计时器,避免重复触发
|
||||||
try {
|
timerCheckAutoUpdateWithSilence.Stop();
|
||||||
if (!Topmost || inkCanvas.Strokes.Count > 0) return;
|
|
||||||
}
|
|
||||||
catch (Exception ex) {
|
|
||||||
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
try {
|
try {
|
||||||
if (AutoUpdateWithSilenceTimeComboBox.CheckIsInSilencePeriod(
|
// 检查是否有可用的更新
|
||||||
Settings.Startup.AutoUpdateWithSilenceStartTime,
|
if (string.IsNullOrEmpty(AvailableLatestVersion)) {
|
||||||
Settings.Startup.AutoUpdateWithSilenceEndTime)) {
|
LogHelper.WriteLogToFile("AutoUpdate | No available update version found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否启用了静默更新
|
||||||
|
if (!Settings.Startup.IsAutoUpdateWithSilence) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Silent update is disabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查更新文件是否已下载
|
||||||
|
string updatesFolderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "AutoUpdate");
|
||||||
|
string statusFilePath = Path.Combine(updatesFolderPath, $"DownloadV{AvailableLatestVersion}Status.txt");
|
||||||
|
|
||||||
|
if (!File.Exists(statusFilePath) || File.ReadAllText(statusFilePath).Trim().ToLower() != "true") {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update file not downloaded yet");
|
||||||
|
|
||||||
|
// 尝试下载更新文件
|
||||||
|
Task.Run(async () => {
|
||||||
|
bool isDownloadSuccessful = await AutoUpdateHelper.DownloadSetupFileAndSaveStatus(AvailableLatestVersion);
|
||||||
|
if (isDownloadSuccessful) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update downloaded successfully, will check again for installation");
|
||||||
|
// 重新启动计时器,下次检查时安装
|
||||||
|
timerCheckAutoUpdateWithSilence.Start();
|
||||||
|
} else {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Failed to download update", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否在静默更新时间段内
|
||||||
|
bool isInSilencePeriod = AutoUpdateWithSilenceTimeComboBox.CheckIsInSilencePeriod(
|
||||||
|
Settings.Startup.AutoUpdateWithSilenceStartTime,
|
||||||
|
Settings.Startup.AutoUpdateWithSilenceEndTime);
|
||||||
|
|
||||||
|
if (!isInSilencePeriod) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Not in silence update time period");
|
||||||
|
// 重新启动计时器,稍后再检查
|
||||||
|
timerCheckAutoUpdateWithSilence.Start();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查应用程序状态,确保可以安全更新
|
||||||
|
bool canSafelyUpdate = false;
|
||||||
|
|
||||||
|
Dispatcher.Invoke(() => {
|
||||||
|
try {
|
||||||
|
// 检查是否处于桌面模式(Topmost为true)且没有墨迹内容
|
||||||
|
if (Topmost && inkCanvas.Strokes.Count == 0) {
|
||||||
|
// 检查是否有未保存的内容或正在进行的操作
|
||||||
|
if (!isHidingSubPanelsWhenInking) {
|
||||||
|
canSafelyUpdate = true;
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Application is in a safe state for update");
|
||||||
|
} else {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Application is currently performing operations");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Application has unsaved content or is not in desktop mode");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Error checking application state: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (canSafelyUpdate) {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Installing update now");
|
||||||
|
|
||||||
|
// 设置为用户主动退出,避免被看门狗判定为崩溃
|
||||||
|
App.IsAppExitByUser = true;
|
||||||
|
|
||||||
|
// 执行更新安装
|
||||||
AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, true);
|
AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, true);
|
||||||
timerCheckAutoUpdateWithSilence.Stop();
|
|
||||||
|
// 关闭应用程序
|
||||||
|
Dispatcher.Invoke(() => {
|
||||||
|
Application.Current.Shutdown();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Cannot safely update now, will try again later");
|
||||||
|
// 重新启动计时器,稍后再检查
|
||||||
|
timerCheckAutoUpdateWithSilence.Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"AutoUpdate | Error in silent update check: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
// 出错时重新启动计时器,稍后再检查
|
||||||
|
timerCheckAutoUpdateWithSilence.Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,6 +91,24 @@ namespace Ink_Canvas {
|
|||||||
ViewboxFloatingBar.IsHitTestVisible = false;
|
ViewboxFloatingBar.IsHitTestVisible = false;
|
||||||
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
||||||
|
|
||||||
|
// 确保手写笔模式下显示光标
|
||||||
|
if (Settings.Canvas.IsShowCursor) {
|
||||||
|
inkCanvas.ForceCursor = true;
|
||||||
|
inkCanvas.UseCustomCursor = true;
|
||||||
|
|
||||||
|
// 根据当前编辑模式设置不同的光标
|
||||||
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) {
|
||||||
|
inkCanvas.Cursor = Cursors.Cross;
|
||||||
|
} else if (inkCanvas.EditingMode == InkCanvasEditingMode.Ink) {
|
||||||
|
var sri = Application.GetResourceStream(new Uri("Resources/Cursors/Pen.cur", UriKind.Relative));
|
||||||
|
if (sri != null)
|
||||||
|
inkCanvas.Cursor = new Cursor(sri.Stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 强制显示光标
|
||||||
|
System.Windows.Forms.Cursor.Show();
|
||||||
|
}
|
||||||
|
|
||||||
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|
||||||
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke
|
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke
|
||||||
|| inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
|
|| inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
|
||||||
@@ -137,6 +155,13 @@ namespace Ink_Canvas {
|
|||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
|
|
||||||
|
// 确保手写笔移动时光标保持可见
|
||||||
|
if (Settings.Canvas.IsShowCursor) {
|
||||||
|
inkCanvas.ForceCursor = true;
|
||||||
|
inkCanvas.UseCustomCursor = true;
|
||||||
|
System.Windows.Forms.Cursor.Show();
|
||||||
|
}
|
||||||
|
|
||||||
var strokeVisual = GetStrokeVisual(e.StylusDevice.Id);
|
var strokeVisual = GetStrokeVisual(e.StylusDevice.Id);
|
||||||
var stylusPointCollection = e.GetStylusPoints(this);
|
var stylusPointCollection = e.GetStylusPoints(this);
|
||||||
foreach (var stylusPoint in stylusPointCollection)
|
foreach (var stylusPoint in stylusPointCollection)
|
||||||
@@ -224,8 +249,17 @@ namespace Ink_Canvas {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
inkCanvas.EraserShape = new EllipseStylusShape(boundsWidth * k * eraserMultiplier,
|
// 根据EraserShapeType设置合适的橡皮擦形状
|
||||||
boundsWidth * k * eraserMultiplier);
|
if (Settings.Canvas.EraserShapeType == 0) {
|
||||||
|
// 圆形擦
|
||||||
|
inkCanvas.EraserShape = new EllipseStylusShape(boundsWidth * k * eraserMultiplier,
|
||||||
|
boundsWidth * k * eraserMultiplier);
|
||||||
|
} else if (Settings.Canvas.EraserShapeType == 1) {
|
||||||
|
// 矩形黑板擦
|
||||||
|
inkCanvas.EraserShape = new RectangleStylusShape(boundsWidth * k * eraserMultiplier * 0.6,
|
||||||
|
boundsWidth * k * eraserMultiplier);
|
||||||
|
}
|
||||||
|
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -245,7 +279,8 @@ namespace Ink_Canvas {
|
|||||||
isLastTouchEraser = false;
|
isLastTouchEraser = false;
|
||||||
// 修复面积擦时不显示橡皮形状:无论 forcePointEraser 状态,均显示 50x50 橡皮
|
// 修复面积擦时不显示橡皮形状:无论 forcePointEraser 状态,均显示 50x50 橡皮
|
||||||
inkCanvas.EraserShape = new EllipseStylusShape(50, 50);
|
inkCanvas.EraserShape = new EllipseStylusShape(50, 50);
|
||||||
if (forceEraser) return;
|
// 修复触屏状态下几何绘制功能不可用的问题:在几何绘制模式下不应该因为forceEraser而直接返回
|
||||||
|
if (forceEraser && drawingShapeMode == 0) return;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -304,6 +339,16 @@ namespace Ink_Canvas {
|
|||||||
inkCanvas.EditingMode = lastInkCanvasEditingMode;
|
inkCanvas.EditingMode = lastInkCanvasEditingMode;
|
||||||
dec.Remove(e.TouchDevice.Id);
|
dec.Remove(e.TouchDevice.Id);
|
||||||
inkCanvas.Opacity = 1;
|
inkCanvas.Opacity = 1;
|
||||||
|
|
||||||
|
// 如果是手掌触发的面积擦抬起,需要确保橡皮擦形状被正确重置
|
||||||
|
if (isLastTouchEraser && dec.Count == 0) {
|
||||||
|
isLastTouchEraser = false;
|
||||||
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint && forcePointEraser) {
|
||||||
|
// 重新应用当前设置的橡皮擦形状
|
||||||
|
ApplyCurrentEraserShape();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (dec.Count == 0)
|
if (dec.Count == 0)
|
||||||
if (lastTouchDownStrokeCollection.Count() != inkCanvas.Strokes.Count() &&
|
if (lastTouchDownStrokeCollection.Count() != inkCanvas.Strokes.Count() &&
|
||||||
!(drawingShapeMode == 9 && !isFirstTouchCuboid)) {
|
!(drawingShapeMode == 9 && !isFirstTouchCuboid)) {
|
||||||
|
|||||||
@@ -65,8 +65,22 @@ namespace Ink_Canvas
|
|||||||
var mainWin = (MainWindow)Application.Current.MainWindow;
|
var mainWin = (MainWindow)Application.Current.MainWindow;
|
||||||
if (mainWin.IsLoaded) {
|
if (mainWin.IsLoaded) {
|
||||||
App.IsAppExitByUser = true;
|
App.IsAppExitByUser = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 启动新实例
|
||||||
|
string exePath = Process.GetCurrentProcess().MainModule.FileName;
|
||||||
|
ProcessStartInfo startInfo = new ProcessStartInfo();
|
||||||
|
startInfo.FileName = exePath;
|
||||||
|
startInfo.UseShellExecute = true;
|
||||||
|
|
||||||
|
// 启动进程但不等待
|
||||||
|
Process.Start(startInfo);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.NewLog($"重启程序时出错: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 退出当前实例
|
||||||
Application.Current.Shutdown();
|
Application.Current.Shutdown();
|
||||||
// mainWin.BtnExit_Click(null,null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,5 +49,5 @@ using System.Windows;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.6.3.0")]
|
[assembly: AssemblyVersion("1.6.7")]
|
||||||
[assembly: AssemblyFileVersion("1.6.3.0")]
|
[assembly: AssemblyFileVersion("1.6.7")]
|
||||||
@@ -10,20 +10,24 @@
|
|||||||
ui:WindowHelper.UseModernWindowStyle = "True"
|
ui:WindowHelper.UseModernWindowStyle = "True"
|
||||||
ui:WindowHelper.SystemBackdropType="Mica"
|
ui:WindowHelper.SystemBackdropType="Mica"
|
||||||
ui:TitleBar.Height="36"
|
ui:TitleBar.Height="36"
|
||||||
Title="InkCanvasForClass有新版本可用" Height="475" Width="800" ResizeMode="NoResize">
|
Title="InkCanvasForClass CE有新版本可用" Height="680" Width="850" ResizeMode="NoResize"
|
||||||
<Grid Background="#fafafa">
|
WindowStartupLocation="CenterScreen">
|
||||||
<ui:SimpleStackPanel VerticalAlignment="Stretch" Spacing="0">
|
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||||
|
<Grid Background="#fafafa" Margin="0,0,0,30">
|
||||||
|
<ui:SimpleStackPanel VerticalAlignment="Stretch" Spacing="0">
|
||||||
|
<!-- 标题栏 -->
|
||||||
<ui:SimpleStackPanel Orientation="Horizontal" Background="#2563eb" Margin="0,0,0,0">
|
<ui:SimpleStackPanel Orientation="Horizontal" Background="#2563eb" Margin="0,0,0,0">
|
||||||
<ui:SimpleStackPanel Orientation="Vertical" Width="685" Margin="24,18,0,12" Spacing="2">
|
<ui:SimpleStackPanel Orientation="Vertical" Width="735" Margin="24,18,0,12" Spacing="2">
|
||||||
<TextBlock Text="InkCanvasForClass 新版本来了!" FontSize="24" FontWeight="Bold" Foreground="White" TextAlignment="Left"/>
|
<TextBlock Text="InkCanvasForClass CE新版本来了!" FontSize="24" FontWeight="Bold" Foreground="White" TextAlignment="Left"/>
|
||||||
<TextBlock Text="希望您能喜欢我们的新版本 :-)" FontSize="20" TextAlignment="Left" Foreground="White"/>
|
<TextBlock Text="希望您能喜欢我们的新版本 :-)" FontSize="20" TextAlignment="Left" Foreground="White"/>
|
||||||
</ui:SimpleStackPanel>
|
</ui:SimpleStackPanel>
|
||||||
<Image Source="/Resources/Icons-fluent/party.png" Width="72" Height="72"/>
|
<Image Source="/Resources/Icons-fluent/party.png" Width="72" Height="72"/>
|
||||||
</ui:SimpleStackPanel>
|
</ui:SimpleStackPanel>
|
||||||
|
|
||||||
<Border BorderBrush="#3f3f46" Background="White" BorderThickness="1" CornerRadius="4" Margin="24,12,24,0">
|
<!-- 更新内容 -->
|
||||||
<ui:ScrollViewerEx Margin="0" VerticalScrollBarVisibility="Auto" Height="256" PanningMode="VerticalOnly">
|
<Border BorderBrush="#3f3f46" Background="White" BorderThickness="1" CornerRadius="4" Margin="24,16,24,0">
|
||||||
<mdxam:MarkdownScrollViewer xml:space="preserve" Foreground="Black" MarkdownStyleName="GithubLike">
|
<ui:ScrollViewerEx Margin="0" VerticalScrollBarVisibility="Auto" Height="180" PanningMode="VerticalOnly">
|
||||||
|
<mdxam:MarkdownScrollViewer x:Name="markdownContent" xml:space="preserve" Foreground="Black" MarkdownStyleName="GithubLike">
|
||||||
# InkCanvasForClass v5.0.2更新
|
# InkCanvasForClass v5.0.2更新
|
||||||
|
|
||||||
你好,旅行者们,本次InkCanvasForClass更新带来了如下新功能供您探索:
|
你好,旅行者们,本次InkCanvasForClass更新带来了如下新功能供您探索:
|
||||||
@@ -39,21 +43,63 @@
|
|||||||
</mdxam:MarkdownScrollViewer>
|
</mdxam:MarkdownScrollViewer>
|
||||||
</ui:ScrollViewerEx>
|
</ui:ScrollViewerEx>
|
||||||
</Border>
|
</Border>
|
||||||
<ui:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="12" Margin="0,8,0,0">
|
|
||||||
<TextBlock Text="本次更新: 4.9.1 -> 5.9.1" FontWeight="Bold" FontSize="14" TextAlignment="Center"/>
|
<!-- 版本信息 -->
|
||||||
<TextBlock Text="2024年8月4日发布更新" FontSize="14" TextAlignment="Center"/>
|
<ui:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="16" Margin="0,16,0,0">
|
||||||
|
<TextBlock x:Name="updateVersionInfo" Text="本次更新: 4.9.1 -> 5.9.1" FontWeight="Bold" FontSize="15" TextAlignment="Center"/>
|
||||||
|
<TextBlock x:Name="updateDateInfo" Text="2024年8月4日发布更新" FontSize="15" TextAlignment="Center"/>
|
||||||
</ui:SimpleStackPanel>
|
</ui:SimpleStackPanel>
|
||||||
<ui:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="12">
|
|
||||||
<Button Content="立刻更新" Foreground="White" HorizontalAlignment="Center" Margin="0,10,0,0">
|
<!-- 自动更新选项 -->
|
||||||
<Button.Resources>
|
<Border Background="White" BorderBrush="#e2e8f0" BorderThickness="1" CornerRadius="4" Margin="24,16,24,0">
|
||||||
<SolidColorBrush x:Key="{x:Static ui:ThemeKeys.ButtonBackgroundKey}" Color="#15803d"/>
|
<ui:SimpleStackPanel Orientation="Vertical" HorizontalAlignment="Center" Margin="0,16,0,16" Spacing="10">
|
||||||
<SolidColorBrush x:Key="{x:Static ui:ThemeKeys.ButtonBackgroundPointerOverKey}" Color="#15803d"/>
|
<TextBlock Text="更新设置" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center" Margin="0,0,0,6"/>
|
||||||
<SolidColorBrush x:Key="{x:Static ui:ThemeKeys.ButtonBackgroundPressedKey}" Color="#166534"/>
|
|
||||||
</Button.Resources>
|
<!-- 水平排列两个ToggleSwitch -->
|
||||||
</Button>
|
<ui:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="20">
|
||||||
<Button Content="下次更新" Foreground="Black" HorizontalAlignment="Center" Margin="0,10,0,0"/>
|
<ui:SimpleStackPanel Orientation="Vertical" Spacing="4">
|
||||||
<Button Content="跳过该版本" HorizontalAlignment="Center" Foreground="#71717a" Margin="0,10,0,0"/>
|
<ui:ToggleSwitch x:Name="EnableAutoUpdateToggle" Header="启用自动更新" OnContent="开启" OffContent="关闭" IsOn="True" Width="170" Foreground="Black"/>
|
||||||
|
</ui:SimpleStackPanel>
|
||||||
|
|
||||||
|
<ui:SimpleStackPanel Orientation="Vertical" Spacing="4">
|
||||||
|
<ui:ToggleSwitch x:Name="EnableSilentUpdateToggle" Header="启用静默更新" OnContent="开启" OffContent="关闭" Width="170" Foreground="Black"/>
|
||||||
|
</ui:SimpleStackPanel>
|
||||||
|
</ui:SimpleStackPanel>
|
||||||
|
|
||||||
|
<TextBlock Text="静默更新将在软件不使用时自动安装,无需手动操作" FontSize="13" Foreground="#71717a" HorizontalAlignment="Center"
|
||||||
|
Margin="4,0,0,0" Width="360" TextWrapping="Wrap"/>
|
||||||
|
</ui:SimpleStackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- 更新按钮组 -->
|
||||||
|
<Border Background="#f1f5f9" BorderBrush="#e2e8f0" BorderThickness="1" CornerRadius="4" Margin="24,16,24,20">
|
||||||
|
<ui:SimpleStackPanel Orientation="Vertical" HorizontalAlignment="Center" Spacing="14" Margin="0,16,0,16">
|
||||||
|
<TextBlock Text="请选择更新方式" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center" Margin="0,0,0,6"/>
|
||||||
|
|
||||||
|
<!-- 立即更新按钮 -->
|
||||||
|
<Button x:Name="UpdateNowButton" Content="立刻下载并安装" Foreground="White" FontSize="15" FontWeight="SemiBold"
|
||||||
|
Padding="20,10" Width="360" Height="48" HorizontalAlignment="Center"
|
||||||
|
Click="UpdateNowButton_Click" ToolTip="立即下载更新并在完成后安装" Visibility="Visible" IsEnabled="True">
|
||||||
|
<Button.Resources>
|
||||||
|
<SolidColorBrush x:Key="{x:Static ui:ThemeKeys.ButtonBackgroundKey}" Color="#15803d"/>
|
||||||
|
<SolidColorBrush x:Key="{x:Static ui:ThemeKeys.ButtonBackgroundPointerOverKey}" Color="#15803d"/>
|
||||||
|
<SolidColorBrush x:Key="{x:Static ui:ThemeKeys.ButtonBackgroundPressedKey}" Color="#166534"/>
|
||||||
|
</Button.Resources>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<!-- 稍后更新按钮 -->
|
||||||
|
<Button x:Name="UpdateLaterButton" Content="下载并在软件关闭时安装" Foreground="Black" FontSize="15"
|
||||||
|
Padding="20,10" Width="360" Height="48" HorizontalAlignment="Center"
|
||||||
|
Click="UpdateLaterButton_Click" Background="#e2e8f0" BorderBrush="#cbd5e1"
|
||||||
|
ToolTip="后台下载更新,在软件关闭时自动安装" Visibility="Visible" IsEnabled="True"/>
|
||||||
|
|
||||||
|
<!-- 跳过版本按钮 -->
|
||||||
|
<Button x:Name="SkipVersionButton" Content="跳过该版本" HorizontalAlignment="Center" Foreground="#71717a"
|
||||||
|
FontSize="15" Padding="20,10" Width="360" Height="48" Click="SkipVersionButton_Click"
|
||||||
|
Background="#f8fafc" BorderBrush="#cbd5e1" ToolTip="跳过此版本更新" Visibility="Visible" IsEnabled="True"/>
|
||||||
|
</ui:SimpleStackPanel>
|
||||||
|
</Border>
|
||||||
</ui:SimpleStackPanel>
|
</ui:SimpleStackPanel>
|
||||||
</ui:SimpleStackPanel>
|
</Grid>
|
||||||
</Grid>
|
</ScrollViewer>
|
||||||
</Window>
|
</Window>
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
|
|
||||||
int useImmersiveDarkMode = enabled ? 1 : 0;
|
int useImmersiveDarkMode = enabled ? 1 : 0;
|
||||||
return DwmSetWindowAttribute(handle, (int)attribute, ref useImmersiveDarkMode, sizeof(int)) == 0;
|
return DwmSetWindowAttribute(handle, attribute, ref useImmersiveDarkMode, sizeof(int)) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -55,12 +55,261 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
return Environment.OSVersion.Version.Major >= 10 && Environment.OSVersion.Version.Build >= build;
|
return Environment.OSVersion.Version.Major >= 10 && Environment.OSVersion.Version.Build >= build;
|
||||||
}
|
}
|
||||||
public HasNewUpdateWindow()
|
|
||||||
|
// 存储更新版本信息
|
||||||
|
public string CurrentVersion { get; set; }
|
||||||
|
public string NewVersion { get; set; }
|
||||||
|
public string ReleaseDate { get; set; }
|
||||||
|
public string ReleaseNotes { get; set; }
|
||||||
|
|
||||||
|
// 更新按钮结果
|
||||||
|
public enum UpdateResult
|
||||||
|
{
|
||||||
|
UpdateNow,
|
||||||
|
UpdateLater,
|
||||||
|
SkipVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
public UpdateResult Result { get; private set; } = UpdateResult.UpdateLater;
|
||||||
|
|
||||||
|
// 更新设置
|
||||||
|
public bool IsAutoUpdateEnabled => EnableAutoUpdateToggle.IsOn;
|
||||||
|
public bool IsSilentUpdateEnabled => EnableSilentUpdateToggle.IsOn;
|
||||||
|
|
||||||
|
public HasNewUpdateWindow(string currentVersion, string newVersion, string releaseDate, string releaseNotes = null)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置版本信息
|
||||||
|
CurrentVersion = currentVersion;
|
||||||
|
NewVersion = newVersion;
|
||||||
|
ReleaseDate = releaseDate;
|
||||||
|
ReleaseNotes = releaseNotes;
|
||||||
|
|
||||||
|
// 更新UI
|
||||||
|
updateVersionInfo.Text = $"本次更新: {CurrentVersion} -> {NewVersion}";
|
||||||
|
updateDateInfo.Text = $"{ReleaseDate}发布更新";
|
||||||
|
|
||||||
|
// 如果有发布说明,设置到Markdown内容中
|
||||||
|
if (!string.IsNullOrEmpty(ReleaseNotes))
|
||||||
|
{
|
||||||
|
markdownContent.Markdown = ReleaseNotes;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化自动更新设置
|
||||||
|
EnableAutoUpdateToggle.IsOn = MainWindow.Settings.Startup.IsAutoUpdate;
|
||||||
|
EnableSilentUpdateToggle.IsOn = MainWindow.Settings.Startup.IsAutoUpdateWithSilence;
|
||||||
|
|
||||||
|
// 确保按钮可见且可用
|
||||||
|
EnsureButtonsVisibility();
|
||||||
|
|
||||||
|
// 显示窗口动画
|
||||||
AnimationsHelper.ShowWithFadeIn(this, 0.25);
|
AnimationsHelper.ShowWithFadeIn(this, 0.25);
|
||||||
Trace.WriteLine(new WindowInteropHelper(this).Handle);
|
|
||||||
|
// 设置深色模式
|
||||||
UseImmersiveDarkMode(new WindowInteropHelper(this).Handle, true);
|
UseImmersiveDarkMode(new WindowInteropHelper(this).Handle, true);
|
||||||
|
|
||||||
|
// 窗口加载完成后再次确保按钮可见
|
||||||
|
this.Loaded += HasNewUpdateWindow_Loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HasNewUpdateWindow_Loaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
// 窗口加载完成后再次确保按钮可见
|
||||||
|
EnsureButtonsVisibility();
|
||||||
|
|
||||||
|
// 调整窗口大小以适应屏幕分辨率
|
||||||
|
AdjustWindowSizeForScreenResolution();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保按钮可见并启用
|
||||||
|
private void EnsureButtonsVisibility()
|
||||||
|
{
|
||||||
|
// 确保立即更新按钮可见
|
||||||
|
UpdateNowButton.Visibility = Visibility.Visible;
|
||||||
|
UpdateNowButton.IsEnabled = true;
|
||||||
|
|
||||||
|
// 确保稍后更新按钮可见
|
||||||
|
UpdateLaterButton.Visibility = Visibility.Visible;
|
||||||
|
UpdateLaterButton.IsEnabled = true;
|
||||||
|
|
||||||
|
// 确保跳过版本按钮可见
|
||||||
|
SkipVersionButton.Visibility = Visibility.Visible;
|
||||||
|
SkipVersionButton.IsEnabled = true;
|
||||||
|
|
||||||
|
// 强制刷新UI
|
||||||
|
UpdateLayout();
|
||||||
|
|
||||||
|
// 记录日志
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update dialog buttons visibility ensured");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateNowButton_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update Now button clicked");
|
||||||
|
|
||||||
|
// 保存自动更新设置
|
||||||
|
SaveUpdateSettings();
|
||||||
|
|
||||||
|
// 设置结果为立即更新
|
||||||
|
Result = UpdateResult.UpdateNow;
|
||||||
|
|
||||||
|
// 关闭窗口,返回到MainWindow处理后续下载和安装流程
|
||||||
|
DialogResult = true;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateLaterButton_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Update Later button clicked");
|
||||||
|
|
||||||
|
// 保存自动更新设置
|
||||||
|
SaveUpdateSettings();
|
||||||
|
|
||||||
|
// 设置结果为稍后更新
|
||||||
|
Result = UpdateResult.UpdateLater;
|
||||||
|
|
||||||
|
// 关闭窗口
|
||||||
|
DialogResult = true;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SkipVersionButton_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Skip Version button clicked");
|
||||||
|
|
||||||
|
// 保存自动更新设置
|
||||||
|
SaveUpdateSettings();
|
||||||
|
|
||||||
|
// 设置结果为跳过该版本
|
||||||
|
Result = UpdateResult.SkipVersion;
|
||||||
|
|
||||||
|
// 关闭窗口
|
||||||
|
DialogResult = true;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SaveUpdateSettings()
|
||||||
|
{
|
||||||
|
// 保存自动更新设置
|
||||||
|
MainWindow.Settings.Startup.IsAutoUpdate = EnableAutoUpdateToggle.IsOn;
|
||||||
|
MainWindow.Settings.Startup.IsAutoUpdateWithSilence = EnableSilentUpdateToggle.IsOn;
|
||||||
|
|
||||||
|
// 记录到日志
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | User settings changed: AutoUpdate={EnableAutoUpdateToggle.IsOn}, SilentUpdate={EnableSilentUpdateToggle.IsOn}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据屏幕分辨率调整窗口大小
|
||||||
|
private void AdjustWindowSizeForScreenResolution()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 获取主屏幕分辨率
|
||||||
|
double screenWidth = SystemParameters.PrimaryScreenWidth;
|
||||||
|
double screenHeight = SystemParameters.PrimaryScreenHeight;
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Screen resolution: {screenWidth}x{screenHeight}");
|
||||||
|
|
||||||
|
// 始终确保窗口不超过屏幕大小的85%
|
||||||
|
double maxHeight = screenHeight * 0.85;
|
||||||
|
double maxWidth = screenWidth * 0.85;
|
||||||
|
|
||||||
|
bool needsAdjustment = false;
|
||||||
|
|
||||||
|
// 如果窗口高度超过最大允许高度,调整窗口高度
|
||||||
|
if (this.Height > maxHeight)
|
||||||
|
{
|
||||||
|
this.Height = maxHeight;
|
||||||
|
needsAdjustment = true;
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Adjusted window height to: {this.Height}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果窗口宽度超过最大允许宽度,调整窗口宽度
|
||||||
|
if (this.Width > maxWidth)
|
||||||
|
{
|
||||||
|
this.Width = maxWidth;
|
||||||
|
needsAdjustment = true;
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Adjusted window width to: {this.Width}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果屏幕分辨率较低,调整更多UI元素
|
||||||
|
if (screenHeight < 768 || screenWidth < 1024 || needsAdjustment)
|
||||||
|
{
|
||||||
|
// 查找相关控件并调整大小
|
||||||
|
var markdownViewer = this.FindName("markdownContent") as MdXaml.MarkdownScrollViewer;
|
||||||
|
var updateNowButton = this.FindName("UpdateNowButton") as Button;
|
||||||
|
var updateLaterButton = this.FindName("UpdateLaterButton") as Button;
|
||||||
|
var skipVersionButton = this.FindName("SkipVersionButton") as Button;
|
||||||
|
|
||||||
|
// 查找包含ScrollViewer的边框控件,减小其高度
|
||||||
|
var contentBorders = this.FindVisualChildren<Border>().ToList();
|
||||||
|
foreach (var border in contentBorders)
|
||||||
|
{
|
||||||
|
if (border.Child is ScrollViewer || border.Child is iNKORE.UI.WPF.Modern.Controls.ScrollViewerEx)
|
||||||
|
{
|
||||||
|
// 减小内容显示区域的高度
|
||||||
|
if (border.Height > 180)
|
||||||
|
{
|
||||||
|
border.Height = 160;
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Reduced content area height");
|
||||||
|
}
|
||||||
|
else if (border.Child is iNKORE.UI.WPF.Modern.Controls.ScrollViewerEx scrollViewer && scrollViewer.Height > 160)
|
||||||
|
{
|
||||||
|
scrollViewer.Height = 160;
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Reduced scroll viewer height");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调整按钮大小
|
||||||
|
if (updateNowButton != null && updateLaterButton != null && skipVersionButton != null)
|
||||||
|
{
|
||||||
|
updateNowButton.Height = 42;
|
||||||
|
updateLaterButton.Height = 42;
|
||||||
|
skipVersionButton.Height = 42;
|
||||||
|
updateNowButton.Padding = new Thickness(15, 8, 15, 8);
|
||||||
|
updateLaterButton.Padding = new Thickness(15, 8, 15, 8);
|
||||||
|
skipVersionButton.Padding = new Thickness(15, 8, 15, 8);
|
||||||
|
LogHelper.WriteLogToFile("AutoUpdate | Reduced button sizes for small screen");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保窗口在屏幕范围内
|
||||||
|
if (this.Left < 0) this.Left = 0;
|
||||||
|
if (this.Top < 0) this.Top = 0;
|
||||||
|
if (this.Left + this.Width > screenWidth) this.Left = screenWidth - this.Width;
|
||||||
|
if (this.Top + this.Height > screenHeight) this.Top = screenHeight - this.Height;
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Final window size: {this.Width}x{this.Height}");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"AutoUpdate | Error adjusting window size: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 递归查找指定类型的所有子控件
|
||||||
|
private IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj = null) where T : DependencyObject
|
||||||
|
{
|
||||||
|
if (depObj == null)
|
||||||
|
depObj = this;
|
||||||
|
|
||||||
|
if (depObj != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
|
||||||
|
{
|
||||||
|
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
|
||||||
|
if (child != null && child is T)
|
||||||
|
{
|
||||||
|
yield return (T)child;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (T childOfChild in FindVisualChildren<T>(child))
|
||||||
|
{
|
||||||
|
yield return childOfChild;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
Title="Ink Canvas 抽奖" Height="500" Width="900">
|
Title="Ink Canvas 抽奖" Height="500" Width="900">
|
||||||
<Border Background="#F0F3F9" CornerRadius="10" BorderThickness="1" BorderBrush="#0066BF" Margin="0" ClipToBounds="True">
|
<Border Background="#F0F3F9" CornerRadius="10" BorderThickness="1" BorderBrush="#0066BF" Margin="0" ClipToBounds="True">
|
||||||
<Canvas>
|
<Canvas>
|
||||||
<Image Source="/Resources/hatsune-miku1.png" Width="300" Canvas.Bottom="-140" Canvas.Left="-48" Canvas.Top="304"></Image>
|
|
||||||
<Grid Canvas.Left="0" Canvas.Right="0" Canvas.Top="0" Canvas.Bottom="0" Width="900" Height="309" HorizontalAlignment="Center" VerticalAlignment="Top">
|
<Grid Canvas.Left="0" Canvas.Right="0" Canvas.Top="0" Canvas.Bottom="0" Width="900" Height="309" HorizontalAlignment="Center" VerticalAlignment="Top">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="1.8*"/>
|
<ColumnDefinition Width="1.8*"/>
|
||||||
|
|||||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
|||||||
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "BEAF49735E7E2FFA883C57571D23313D74E5483B"
|
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "C618DEE2BF2FDFC3FC9E2911171FB8CC42684DCF"
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// 此代码由工具生成。
|
// 此代码由工具生成。
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "BEAF49735E7E2FFA883C57571D23313D74E5483B"
|
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "C618DEE2BF2FDFC3FC9E2911171FB8CC42684DCF"
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// 此代码由工具生成。
|
// 此代码由工具生成。
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#pragma checksum "..\..\..\..\Windows\HasNewUpdateWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "237DE391CCBF9084C9908BFD5D5B61E01AF3B610"
|
#pragma checksum "..\..\..\..\Windows\HasNewUpdateWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "53772E3067D35407A4B75166FFCE460ECF45D1E7"
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// 此代码由工具生成。
|
// 此代码由工具生成。
|
||||||
@@ -59,6 +59,70 @@ namespace Ink_Canvas {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class HasNewUpdateWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
public partial class HasNewUpdateWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
||||||
|
|
||||||
|
|
||||||
|
#line 30 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal MdXaml.MarkdownScrollViewer markdownContent;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 49 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock updateVersionInfo;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 50 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock updateDateInfo;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 61 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal iNKORE.UI.WPF.Modern.Controls.ToggleSwitch EnableAutoUpdateToggle;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 65 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal iNKORE.UI.WPF.Modern.Controls.ToggleSwitch EnableSilentUpdateToggle;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 80 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button UpdateNowButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 91 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button UpdateLaterButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 97 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button SkipVersionButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
private bool _contentLoaded;
|
private bool _contentLoaded;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -87,6 +151,51 @@ namespace Ink_Canvas {
|
|||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
|
||||||
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
|
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
|
||||||
|
switch (connectionId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
this.markdownContent = ((MdXaml.MarkdownScrollViewer)(target));
|
||||||
|
return;
|
||||||
|
case 2:
|
||||||
|
this.updateVersionInfo = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 3:
|
||||||
|
this.updateDateInfo = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 4:
|
||||||
|
this.EnableAutoUpdateToggle = ((iNKORE.UI.WPF.Modern.Controls.ToggleSwitch)(target));
|
||||||
|
return;
|
||||||
|
case 5:
|
||||||
|
this.EnableSilentUpdateToggle = ((iNKORE.UI.WPF.Modern.Controls.ToggleSwitch)(target));
|
||||||
|
return;
|
||||||
|
case 6:
|
||||||
|
this.UpdateNowButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 82 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
this.UpdateNowButton.Click += new System.Windows.RoutedEventHandler(this.UpdateNowButton_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 7:
|
||||||
|
this.UpdateLaterButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 93 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
this.UpdateLaterButton.Click += new System.Windows.RoutedEventHandler(this.UpdateLaterButton_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 8:
|
||||||
|
this.SkipVersionButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 98 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
this.SkipVersionButton.Click += new System.Windows.RoutedEventHandler(this.SkipVersionButton_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
}
|
||||||
this._contentLoaded = true;
|
this._contentLoaded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#pragma checksum "..\..\..\..\Windows\HasNewUpdateWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "237DE391CCBF9084C9908BFD5D5B61E01AF3B610"
|
#pragma checksum "..\..\..\..\Windows\HasNewUpdateWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "53772E3067D35407A4B75166FFCE460ECF45D1E7"
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// 此代码由工具生成。
|
// 此代码由工具生成。
|
||||||
@@ -59,6 +59,70 @@ namespace Ink_Canvas {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class HasNewUpdateWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
public partial class HasNewUpdateWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
||||||
|
|
||||||
|
|
||||||
|
#line 30 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal MdXaml.MarkdownScrollViewer markdownContent;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 49 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock updateVersionInfo;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 50 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.TextBlock updateDateInfo;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 61 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal iNKORE.UI.WPF.Modern.Controls.ToggleSwitch EnableAutoUpdateToggle;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 65 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal iNKORE.UI.WPF.Modern.Controls.ToggleSwitch EnableSilentUpdateToggle;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 80 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button UpdateNowButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 91 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button UpdateLaterButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
|
#line 97 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
|
internal System.Windows.Controls.Button SkipVersionButton;
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
private bool _contentLoaded;
|
private bool _contentLoaded;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -87,6 +151,51 @@ namespace Ink_Canvas {
|
|||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
|
||||||
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
|
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
|
||||||
|
switch (connectionId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
this.markdownContent = ((MdXaml.MarkdownScrollViewer)(target));
|
||||||
|
return;
|
||||||
|
case 2:
|
||||||
|
this.updateVersionInfo = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 3:
|
||||||
|
this.updateDateInfo = ((System.Windows.Controls.TextBlock)(target));
|
||||||
|
return;
|
||||||
|
case 4:
|
||||||
|
this.EnableAutoUpdateToggle = ((iNKORE.UI.WPF.Modern.Controls.ToggleSwitch)(target));
|
||||||
|
return;
|
||||||
|
case 5:
|
||||||
|
this.EnableSilentUpdateToggle = ((iNKORE.UI.WPF.Modern.Controls.ToggleSwitch)(target));
|
||||||
|
return;
|
||||||
|
case 6:
|
||||||
|
this.UpdateNowButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 82 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
this.UpdateNowButton.Click += new System.Windows.RoutedEventHandler(this.UpdateNowButton_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 7:
|
||||||
|
this.UpdateLaterButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 93 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
this.UpdateLaterButton.Click += new System.Windows.RoutedEventHandler(this.UpdateLaterButton_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
case 8:
|
||||||
|
this.SkipVersionButton = ((System.Windows.Controls.Button)(target));
|
||||||
|
|
||||||
|
#line 98 "..\..\..\..\Windows\HasNewUpdateWindow.xaml"
|
||||||
|
this.SkipVersionButton.Click += new System.Windows.RoutedEventHandler(this.SkipVersionButton_Click);
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
return;
|
||||||
|
}
|
||||||
this._contentLoaded = true;
|
this._contentLoaded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#pragma checksum "..\..\..\..\Windows\RandWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "A29F1514A9DC6332F074303F230464CD5C24A898"
|
#pragma checksum "..\..\..\..\Windows\RandWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "4254CE0F9A30960C1D574123EA132E6F47F23758"
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// 此代码由工具生成。
|
// 此代码由工具生成。
|
||||||
@@ -59,7 +59,7 @@ namespace Ink_Canvas {
|
|||||||
public partial class RandWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
public partial class RandWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
||||||
|
|
||||||
|
|
||||||
#line 22 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 21 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Label LabelOutput;
|
internal System.Windows.Controls.Label LabelOutput;
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 23 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 22 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Label LabelOutput2;
|
internal System.Windows.Controls.Label LabelOutput2;
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 24 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 23 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Label LabelOutput3;
|
internal System.Windows.Controls.Label LabelOutput3;
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 27 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 26 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal iNKORE.UI.WPF.Modern.Controls.SimpleStackPanel PeopleControlPane;
|
internal iNKORE.UI.WPF.Modern.Controls.SimpleStackPanel PeopleControlPane;
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 29 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 28 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnMinus;
|
internal System.Windows.Controls.Border BorderBtnMinus;
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 52 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 51 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.TextBlock LabelNumberCount;
|
internal System.Windows.Controls.TextBlock LabelNumberCount;
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 53 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 52 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnAdd;
|
internal System.Windows.Controls.Border BorderBtnAdd;
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 78 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 77 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.CheckBox NoHotStudents;
|
internal System.Windows.Controls.CheckBox NoHotStudents;
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 81 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 80 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.CheckBox NoShengPiZi;
|
internal System.Windows.Controls.CheckBox NoShengPiZi;
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 86 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 85 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.ComboBox ComboBoxRandMode;
|
internal System.Windows.Controls.ComboBox ComboBoxRandMode;
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 96 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 95 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnRand;
|
internal System.Windows.Controls.Border BorderBtnRand;
|
||||||
|
|
||||||
@@ -147,7 +147,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 99 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 98 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal iNKORE.UI.WPF.Modern.Controls.SymbolIcon SymbolIconStart;
|
internal iNKORE.UI.WPF.Modern.Controls.SymbolIcon SymbolIconStart;
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 104 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 103 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnIslandCaller;
|
internal System.Windows.Controls.Border BorderBtnIslandCaller;
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 114 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 113 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnHelp;
|
internal System.Windows.Controls.Border BorderBtnHelp;
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 122 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 121 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.TextBlock TextBlockPeopleCount;
|
internal System.Windows.Controls.TextBlock TextBlockPeopleCount;
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 125 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 124 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BtnClose;
|
internal System.Windows.Controls.Border BtnClose;
|
||||||
|
|
||||||
@@ -239,7 +239,7 @@ namespace Ink_Canvas {
|
|||||||
case 6:
|
case 6:
|
||||||
this.BorderBtnMinus = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnMinus = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 29 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 28 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnMinus.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnMinus_MouseUp);
|
this.BorderBtnMinus.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnMinus_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -251,7 +251,7 @@ namespace Ink_Canvas {
|
|||||||
case 8:
|
case 8:
|
||||||
this.BorderBtnAdd = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnAdd = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 53 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 52 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnAdd.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnAdd_MouseUp);
|
this.BorderBtnAdd.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnAdd_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -269,7 +269,7 @@ namespace Ink_Canvas {
|
|||||||
case 12:
|
case 12:
|
||||||
this.BorderBtnRand = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnRand = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 96 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 95 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnRand.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnRand_MouseUp);
|
this.BorderBtnRand.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnRand_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -281,7 +281,7 @@ namespace Ink_Canvas {
|
|||||||
case 14:
|
case 14:
|
||||||
this.BorderBtnIslandCaller = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnIslandCaller = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 104 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 103 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnIslandCaller.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnIslandCaller_MouseUp);
|
this.BorderBtnIslandCaller.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnIslandCaller_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -290,7 +290,7 @@ namespace Ink_Canvas {
|
|||||||
case 15:
|
case 15:
|
||||||
this.BorderBtnHelp = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnHelp = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 114 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 113 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnHelp.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnHelp_MouseUp);
|
this.BorderBtnHelp.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnHelp_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -302,7 +302,7 @@ namespace Ink_Canvas {
|
|||||||
case 17:
|
case 17:
|
||||||
this.BtnClose = ((System.Windows.Controls.Border)(target));
|
this.BtnClose = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 125 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 124 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BtnClose.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_MouseUp);
|
this.BtnClose.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#pragma checksum "..\..\..\..\Windows\RandWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "A29F1514A9DC6332F074303F230464CD5C24A898"
|
#pragma checksum "..\..\..\..\Windows\RandWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "4254CE0F9A30960C1D574123EA132E6F47F23758"
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// 此代码由工具生成。
|
// 此代码由工具生成。
|
||||||
@@ -59,7 +59,7 @@ namespace Ink_Canvas {
|
|||||||
public partial class RandWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
public partial class RandWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
||||||
|
|
||||||
|
|
||||||
#line 22 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 21 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Label LabelOutput;
|
internal System.Windows.Controls.Label LabelOutput;
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 23 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 22 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Label LabelOutput2;
|
internal System.Windows.Controls.Label LabelOutput2;
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 24 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 23 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Label LabelOutput3;
|
internal System.Windows.Controls.Label LabelOutput3;
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 27 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 26 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal iNKORE.UI.WPF.Modern.Controls.SimpleStackPanel PeopleControlPane;
|
internal iNKORE.UI.WPF.Modern.Controls.SimpleStackPanel PeopleControlPane;
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 29 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 28 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnMinus;
|
internal System.Windows.Controls.Border BorderBtnMinus;
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 52 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 51 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.TextBlock LabelNumberCount;
|
internal System.Windows.Controls.TextBlock LabelNumberCount;
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 53 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 52 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnAdd;
|
internal System.Windows.Controls.Border BorderBtnAdd;
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 78 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 77 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.CheckBox NoHotStudents;
|
internal System.Windows.Controls.CheckBox NoHotStudents;
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 81 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 80 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.CheckBox NoShengPiZi;
|
internal System.Windows.Controls.CheckBox NoShengPiZi;
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 86 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 85 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.ComboBox ComboBoxRandMode;
|
internal System.Windows.Controls.ComboBox ComboBoxRandMode;
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 96 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 95 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnRand;
|
internal System.Windows.Controls.Border BorderBtnRand;
|
||||||
|
|
||||||
@@ -147,7 +147,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 99 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 98 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal iNKORE.UI.WPF.Modern.Controls.SymbolIcon SymbolIconStart;
|
internal iNKORE.UI.WPF.Modern.Controls.SymbolIcon SymbolIconStart;
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 104 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 103 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnIslandCaller;
|
internal System.Windows.Controls.Border BorderBtnIslandCaller;
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 114 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 113 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BorderBtnHelp;
|
internal System.Windows.Controls.Border BorderBtnHelp;
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 122 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 121 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.TextBlock TextBlockPeopleCount;
|
internal System.Windows.Controls.TextBlock TextBlockPeopleCount;
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@ namespace Ink_Canvas {
|
|||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
|
|
||||||
#line 125 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 124 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||||
internal System.Windows.Controls.Border BtnClose;
|
internal System.Windows.Controls.Border BtnClose;
|
||||||
|
|
||||||
@@ -239,7 +239,7 @@ namespace Ink_Canvas {
|
|||||||
case 6:
|
case 6:
|
||||||
this.BorderBtnMinus = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnMinus = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 29 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 28 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnMinus.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnMinus_MouseUp);
|
this.BorderBtnMinus.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnMinus_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -251,7 +251,7 @@ namespace Ink_Canvas {
|
|||||||
case 8:
|
case 8:
|
||||||
this.BorderBtnAdd = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnAdd = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 53 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 52 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnAdd.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnAdd_MouseUp);
|
this.BorderBtnAdd.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnAdd_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -269,7 +269,7 @@ namespace Ink_Canvas {
|
|||||||
case 12:
|
case 12:
|
||||||
this.BorderBtnRand = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnRand = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 96 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 95 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnRand.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnRand_MouseUp);
|
this.BorderBtnRand.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnRand_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -281,7 +281,7 @@ namespace Ink_Canvas {
|
|||||||
case 14:
|
case 14:
|
||||||
this.BorderBtnIslandCaller = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnIslandCaller = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 104 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 103 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnIslandCaller.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnIslandCaller_MouseUp);
|
this.BorderBtnIslandCaller.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnIslandCaller_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -290,7 +290,7 @@ namespace Ink_Canvas {
|
|||||||
case 15:
|
case 15:
|
||||||
this.BorderBtnHelp = ((System.Windows.Controls.Border)(target));
|
this.BorderBtnHelp = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 114 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 113 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BorderBtnHelp.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnHelp_MouseUp);
|
this.BorderBtnHelp.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BorderBtnHelp_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
@@ -302,7 +302,7 @@ namespace Ink_Canvas {
|
|||||||
case 17:
|
case 17:
|
||||||
this.BtnClose = ((System.Windows.Controls.Border)(target));
|
this.BtnClose = ((System.Windows.Controls.Border)(target));
|
||||||
|
|
||||||
#line 125 "..\..\..\..\Windows\RandWindow.xaml"
|
#line 124 "..\..\..\..\Windows\RandWindow.xaml"
|
||||||
this.BtnClose.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_MouseUp);
|
this.BtnClose.MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_MouseUp);
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
|
|||||||
Reference in New Issue
Block a user