From 6d8ef17c5e461a02a74f080acaa1cd2582c0ec93 Mon Sep 17 00:00:00 2001 From: denglihong2007 <98096191+denglihong2007@users.noreply.github.com> Date: Sat, 30 Aug 2025 17:58:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=AE=8B=E4=BD=99=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Hailaer/PrimaryScreen.png | Bin 38592 -> 0 bytes .../Assets/Yakeshi/PlatformScreen.png | Bin 11670 -> 0 bytes .../Models/StylesInfoData.json | 459 ------------------ .../Hailaer/PrimaryScreenViewModel.cs | 16 - .../Yakeshi/PlatformScreenViewModel.cs | 13 - .../Views/Hailaer/PrimaryScreenView.xaml | 300 ------------ .../Views/Hailaer/PrimaryScreenView.xaml.cs | 14 - .../Views/Yakeshi/PlatformScreenView.xaml | 90 ---- .../Views/Yakeshi/PlatformScreenView.xaml.cs | 16 - CRSim/CRSim.csproj | 3 + CRSim/UpdateChecker.cs | 373 -------------- .../Windows/Dialogs/TrainStopDialog.xaml.cs | 273 ----------- 12 files changed, 3 insertions(+), 1554 deletions(-) delete mode 100644 CRSim.ScreenSimulator/Assets/Hailaer/PrimaryScreen.png delete mode 100644 CRSim.ScreenSimulator/Assets/Yakeshi/PlatformScreen.png delete mode 100644 CRSim.ScreenSimulator/Models/StylesInfoData.json delete mode 100644 CRSim.ScreenSimulator/ViewModels/Hailaer/PrimaryScreenViewModel.cs delete mode 100644 CRSim.ScreenSimulator/ViewModels/Yakeshi/PlatformScreenViewModel.cs delete mode 100644 CRSim.ScreenSimulator/Views/Hailaer/PrimaryScreenView.xaml delete mode 100644 CRSim.ScreenSimulator/Views/Hailaer/PrimaryScreenView.xaml.cs delete mode 100644 CRSim.ScreenSimulator/Views/Yakeshi/PlatformScreenView.xaml delete mode 100644 CRSim.ScreenSimulator/Views/Yakeshi/PlatformScreenView.xaml.cs delete mode 100644 CRSim/UpdateChecker.cs delete mode 100644 CRSim/Views/Windows/Dialogs/TrainStopDialog.xaml.cs diff --git a/CRSim.ScreenSimulator/Assets/Hailaer/PrimaryScreen.png b/CRSim.ScreenSimulator/Assets/Hailaer/PrimaryScreen.png deleted file mode 100644 index f9d39a5741d226b80688a3036366752e074ecaed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38592 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 IVG{QL0E!0zN&o-= diff --git a/CRSim.ScreenSimulator/Models/StylesInfoData.json b/CRSim.ScreenSimulator/Models/StylesInfoData.json deleted file mode 100644 index 0784ac6..0000000 --- a/CRSim.ScreenSimulator/Models/StylesInfoData.json +++ /dev/null @@ -1,459 +0,0 @@ -[ - { - "UniqueId": "ChengduDong.SecondaryScreen", - "Title": "成都东站次要看板", - "Region": "成都", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "ChengduDong.PrimaryTicketCheckScreen", - "Title": "成都东站检票口主要看板", - "Region": "成都", - "Author": "电排骨", - "Type": "检票口屏", - "Parameters": [ - "Station", - "TicketCheck", - "Text" - ] - }, - { - "UniqueId": "ChengduDong.PillarTicketCheckScreen", - "Title": "成都东站检票口立柱看板", - "Region": "成都", - "Author": "电排骨", - "Type": "检票口屏", - "Parameters": [ - "Station", - "TicketCheck" - ] - }, - { - "UniqueId": "Fuzhou.TicketCheckScreen", - "Title": "福州站检票口看板", - "Region": "福州", - "Author": "电排骨", - "Type": "检票口屏", - "Parameters": [ - "Station", - "TicketCheck", - "Text" - ] - }, - { - "UniqueId": "FuzhouNan.TicketCheckScreen", - "Title": "福州南站检票口看板", - "Region": "福州", - "Author": "电排骨", - "Type": "检票口屏", - "Parameters": [ - "Station", - "TicketCheck", - "Text" - ] - }, - { - "UniqueId": "BeijingXi.PrimaryScreen", - "Title": "北京西站主要看板", - "Region": "北京", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station" - ] - }, - { - "UniqueId": "Harbin.PrimaryScreen", - "Title": "哈尔滨站主要看板", - "Region": "哈尔滨", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "ChengduMetro.PlatformScreen", - "Title": "成都地铁站台看板", - "Region": "成都", - "Author": "电排骨", - "Type": "站台屏", - "Parameters": [ - "Station", - "Text", - "Video", - "Platform" - ] - }, - { - "UniqueId": "XuzhouMetro.PlatformScreen", - "Title": "徐州地铁站台看板", - "Region": "徐州", - "Author": "电排骨", - "Type": "站台屏", - "Parameters": [ - "Station", - "Text", - "Video", - "Platform" - ] - }, - { - "UniqueId": "TianjinMetro.PlatformScreen", - "Title": "天津地铁站台看板", - "Region": "天津", - "Author": "电排骨", - "Type": "站台屏", - "Parameters": [ - "Station", - "Text", - "Video", - "Platform" - ] - }, - { - "UniqueId": "Guangyuan.PrimaryScreen", - "Title": "广元站主要看板", - "Region": "广元", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "ChengduShuangliuAirport.SecondaryScreen", - "Title": "成都双流机场次要看板", - "Region": "成都", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "KunmingChangshuiAirport.PrimaryScreen", - "Title": "昆明长水机场主要看板", - "Region": "昆明", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "Shanghai.OutsideScreen", - "Title": "上海站站外看板", - "Region": "上海", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station" - ] - }, - { - "UniqueId": "Hanzhong.PlatformScreen", - "Title": "汉中站站台看板", - "Region": "汉中", - "Author": "电排骨", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Text" - ] - }, - { - "UniqueId": "Tianjin.PlatformScreen", - "Title": "天津站站台看板", - "Region": "天津", - "Author": "电排骨", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "Mianyang.PlatformScreen", - "Title": "绵阳站站台看板", - "Region": "绵阳", - "Author": "电排骨", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "Zibo.PrimaryScreen", - "Title": "淄博站主要看板", - "Region": "淄博", - "Author": "wxl0430", - "Type": "车站大屏", - "Parameters": [ - "Station" - ] - }, - { - "UniqueId": "Zibo.SecondaryScreen", - "Title": "淄博站次要看板", - "Region": "淄博", - "Author": "wxl0430", - "Type": "车站大屏", - "Parameters": [ - "Station" - ] - }, - { - "UniqueId": "Zibo.TicketCheckScreen", - "Title": "淄博站检票口看板", - "Region": "淄博", - "Author": "wxl0430", - "Type": "检票口屏", - "Parameters": [ - "Station", - "TicketCheck", - "Text" - ] - }, - { - "UniqueId": "Zibo.PlatformScreen", - "Title": "淄博站站台看板", - "Region": "淄博", - "Author": "wxl0430", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location", - "Text" - ] - }, - { - "UniqueId": "Zibo.ConcourseBridgeScreen", - "Title": "淄博站廊桥看板", - "Region": "淄博", - "Author": "wxl0430", - "Type": "走廊出发屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "Zibo.ExitScreen", - "Title": "淄博站出站口看板", - "Region": "淄博", - "Author": "wxl0430", - "Type": "出站口屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "Jinanxi.SmallScreen", - "Title": "济南西站小屏看板", - "Region": "济南", - "Author": "wxl0430", - "Type": "车站大屏", - "Parameters": [ - "Station" - ] - }, - { - "UniqueId": "GuangdongIntercity.SecondaryScreen", - "Title": "广东城际次要看板", - "Region": "广东", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "Ankang.ExitScreen", - "Title": "安康站出站口看板", - "Region": "安康", - "Author": "电排骨", - "Type": "出站口屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "Niuzhou.PrimaryScreen", - "Title": "柳州站主要看板", - "Region": "柳州", - "Author": "电排骨", - "Type": "车站大屏", - "Parameters": [ - "Station", - "Text" - ] - }, - { - "UniqueId": "Beijing.ArrivalScreen", - "Title": "北京站地道到达看板", - "Region": "北京", - "Author": "wxl0430", - "Type": "走廊到达屏", - "Parameters": [ - "Station", - "Platform" - ] - }, - { - "UniqueId": "DaqingDong.ConcourseBridgeScreen", - "Title": "大庆东站廊桥看板", - "Region": "大庆", - "Author": "wxl0430", - "Type": "走廊出发屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "DaqingDong.PlatformScreen", - "Title": "大庆东站站台看板", - "Region": "大庆", - "Author": "wxl0430", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "HarbinXi.PlatformScreen", - "Title": "哈尔滨西站站台看板", - "Region": "哈尔滨", - "Author": "wxl0430", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location", - "Text" - ] - }, - { - "UniqueId": "BeijingNan.PrimaryScreen", - "Title": "北京南站主要看板", - "Region": "北京", - "Author": "wxl0430", - "Type": "车站大屏", - "Parameters": [ - "Station" - ] - }, - { - "UniqueId": "BeijingNan.TicketCheckScreen", - "Title": "北京南站检票口看板", - "Region": "北京", - "Author": "wxl0430", - "Type": "检票口屏", - "Parameters": [ - "Station", - "TicketCheck" - ] - }, - { - "UniqueId": "BeijingNan.PrimaryPlatformScreen", - "Title": "北京南站站台主要看板", - "Region": "北京", - "Author": "电排骨", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "BeijingNan.SecondaryPlatformScreen", - "Title": "北京南站站台次要看板", - "Region": "北京", - "Author": "wxl0430", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "ShenyangBei.PlatformScreen", - "Title": "沈阳北站站台看板", - "Region": "沈阳", - "Author": "电排骨", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "DezhouDong.PrimaryScreen", - "Title": "德州东站主要看板", - "Region": "德州", - "Author": "wxl0430", - "Type": "车站大屏", - "Parameters": [ - "Station" - ] - }, - { - "UniqueId": "DezhouDong.TicketCheckScreen", - "Title": "德州东站检票口看板", - "Region": "德州", - "Author": "wxl0430", - "Type": "检票口屏", - "Parameters": [ - "Station", - "TicketCheck" - ] - }, - { - "UniqueId": "Yakeshi.PlatformScreen", - "Title": "牙克石站站台看板", - "Region": "牙克石", - "Author": "wxl0430", - "Type": "站台屏", - "Parameters": [ - "Station", - "Platform", - "Location" - ] - }, - { - "UniqueId": "Hailaer.PrimaryScreen", - "Title": "海拉尔站主要看板", - "Region": "海拉尔", - "Author": "wxl0430", - "Type": "车站大屏", - "Parameters": [ - "Station", - "Text" - ] - } -] \ No newline at end of file diff --git a/CRSim.ScreenSimulator/ViewModels/Hailaer/PrimaryScreenViewModel.cs b/CRSim.ScreenSimulator/ViewModels/Hailaer/PrimaryScreenViewModel.cs deleted file mode 100644 index 5d1cd47..0000000 --- a/CRSim.ScreenSimulator/ViewModels/Hailaer/PrimaryScreenViewModel.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CRSim.Core.Models; -using CRSim.Core.Services; -namespace CRSim.ScreenSimulator.ViewModels.Hailaer -{ - public class PrimaryScreenViewModel : ScreenViewModel - { - public PrimaryScreenViewModel(ITimeService timeService, ISettingsService settingsService) - : base(timeService, settingsService) - { - ItemsPerPage = 6; - ScreenCount = 2; - Text = $" 开车前{settingsService.GetSettings().StopCheckInAdvanceDuration.TotalMinutes}分钟停止检票";; - StationType = StationType.Departure; - } - } -} diff --git a/CRSim.ScreenSimulator/ViewModels/Yakeshi/PlatformScreenViewModel.cs b/CRSim.ScreenSimulator/ViewModels/Yakeshi/PlatformScreenViewModel.cs deleted file mode 100644 index 515b7c7..0000000 --- a/CRSim.ScreenSimulator/ViewModels/Yakeshi/PlatformScreenViewModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using CRSim.Core.Services; -namespace CRSim.ScreenSimulator.ViewModels.Yakeshi -{ - public class PlatformScreenViewModel : ScreenViewModel - { - public PlatformScreenViewModel(ITimeService timeService, ISettingsService settingsService) - : base(timeService, settingsService) - { - Text = $"上下车不要拥挤,小心列车与站台之间的缝隙,看管好老人和同行的儿童"; - ItemsPerPage = 1; - } - } -} diff --git a/CRSim.ScreenSimulator/Views/Hailaer/PrimaryScreenView.xaml b/CRSim.ScreenSimulator/Views/Hailaer/PrimaryScreenView.xaml deleted file mode 100644 index 8bbac73..0000000 --- a/CRSim.ScreenSimulator/Views/Hailaer/PrimaryScreenView.xaml +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CRSim.ScreenSimulator/Views/Hailaer/PrimaryScreenView.xaml.cs b/CRSim.ScreenSimulator/Views/Hailaer/PrimaryScreenView.xaml.cs deleted file mode 100644 index 1ae1d2e..0000000 --- a/CRSim.ScreenSimulator/Views/Hailaer/PrimaryScreenView.xaml.cs +++ /dev/null @@ -1,14 +0,0 @@ -using CRSim.ScreenSimulator.ViewModels.Hailaer; -namespace CRSim.ScreenSimulator.Views.Hailaer -{ - public partial class PrimaryScreenView : BaseScreenView - { - public PrimaryScreenViewModel ViewModel { get; } - public PrimaryScreenView(PrimaryScreenViewModel viewModel) - { - InitializeComponent(); - ViewModel = viewModel; - DataContext = viewModel; - } - } -} diff --git a/CRSim.ScreenSimulator/Views/Yakeshi/PlatformScreenView.xaml b/CRSim.ScreenSimulator/Views/Yakeshi/PlatformScreenView.xaml deleted file mode 100644 index 5f6896e..0000000 --- a/CRSim.ScreenSimulator/Views/Yakeshi/PlatformScreenView.xaml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CRSim.ScreenSimulator/Views/Yakeshi/PlatformScreenView.xaml.cs b/CRSim.ScreenSimulator/Views/Yakeshi/PlatformScreenView.xaml.cs deleted file mode 100644 index 9978143..0000000 --- a/CRSim.ScreenSimulator/Views/Yakeshi/PlatformScreenView.xaml.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CRSim.ScreenSimulator.ViewModels.Yakeshi; - -namespace CRSim.ScreenSimulator.Views.Yakeshi -{ - public partial class PlatformScreenView : BaseScreenView - { - public PlatformScreenViewModel ViewModel { get; } - public PlatformScreenView(PlatformScreenViewModel viewModel) - { - - InitializeComponent(); - ViewModel = viewModel; - DataContext = viewModel; - } - } -} diff --git a/CRSim/CRSim.csproj b/CRSim/CRSim.csproj index 98e2b15..0c5622f 100644 --- a/CRSim/CRSim.csproj +++ b/CRSim/CRSim.csproj @@ -109,6 +109,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/CRSim/UpdateChecker.cs b/CRSim/UpdateChecker.cs deleted file mode 100644 index 558e720..0000000 --- a/CRSim/UpdateChecker.cs +++ /dev/null @@ -1,373 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Security.Cryptography; -using System.Net.Http; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; -using System.Reflection; - -namespace CRSim -{ - public class UpdateChecker - { - private const string ApiUrl = "https://crsim.com.cn/api/version"; - private readonly HttpClient _httpClient = new HttpClient(); - private ProgressWindow _progressWindow; - private CancellationTokenSource _cancellationTokenSource; - - public async Task CheckForUpdates() - { - try - { - await ExecuteOnUIThread(async () => - { - var currentVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); - var latestVersionInfo = await GetLatestVersionInfo(); - - if (latestVersionInfo != null && latestVersionInfo.ver != currentVersion) - { - var result = ShowQuestion($"有新版本可用,当前版本:{currentVersion}\n最新版本: {latestVersionInfo.ver}\n\n更新日志:\n{latestVersionInfo.log}\n\n是否更新?(点击更新后请等待,程序将自动重启,时间与下载速度有关)"); - - if (result) - { - _cancellationTokenSource = new CancellationTokenSource(); - ShowProgressWindow("准备下载更新..."); - - try - { - await DownloadAndInitiateUpdate(latestVersionInfo, _cancellationTokenSource.Token); - } - catch (OperationCanceledException) - { - ShowMessage("更新已取消"); - } - finally - { - CloseProgressWindow(); - _cancellationTokenSource = null; - } - } - } - }); - } - catch (Exception ex) - { - CloseProgressWindow(); - ShowError($"更新检查失败:{ex.Message}"); - } - } - - private async Task GetLatestVersionInfo() - { - try - { - var response = await _httpClient.GetAsync(ApiUrl); - if (response.IsSuccessStatusCode) - { - var json = await response.Content.ReadAsStringAsync(); - return JsonSerializer.Deserialize(json); - } - } - catch (Exception ex) - { - ShowError($"调用API失败: {ex.Message}"); - } - return null; - } - - private async Task DownloadAndInitiateUpdate(VersionInfo versionInfo, CancellationToken cancellationToken) - { - try - { - var tempFilePath = await DownloadFileWithProgress(versionInfo.download_file, cancellationToken); - - var isValid = await Task.Run(() => ValidateFile(tempFilePath, versionInfo.file_md5, versionInfo.file_sha256)); - - if (!isValid) - { - var forceUpdate = ShowQuestion("md5和sha256验证失败,可能遭到网络劫持,是否强制更新?"); - if (!forceUpdate) - { - File.Delete(tempFilePath); - return; - } - } - - var programDirectory = AppDomain.CurrentDomain.BaseDirectory; - var appExePath = Process.GetCurrentProcess().MainModule.FileName; - var appName = Path.GetFileName(appExePath); - string batchScript = $@" -@echo off -taskkill /F /IM ""{appName}"" >nul 2>&1 -timeout /t 2 >nul -cd /d ""{programDirectory}"" -powershell -Command ""Expand-Archive -Path '{tempFilePath}' -DestinationPath '{programDirectory}' -Force"" -del /f /q ""{tempFilePath}"" -start """" ""{appExePath}"" -exit /b 0 -"; - - string batchFilePath = Path.Combine(Path.GetTempPath(), "CRSimUpdate.bat"); - File.WriteAllText(batchFilePath, batchScript); - - try - { - var processInfo = new ProcessStartInfo - { - FileName = "cmd.exe", - Arguments = $"/c \"{batchFilePath}\"", - WindowStyle = ProcessWindowStyle.Hidden, - UseShellExecute = false, - CreateNoWindow = true - }; - - Process.Start(processInfo); - Application.Current.Shutdown(); - } - catch (Exception ex) - { - ShowError($"启动更新脚本进程失败: {ex.Message}"); - } - } - catch (Exception ex) - { - ShowError($"更新失败: {ex.Message}"); - throw; - } - } - - private async Task DownloadFileWithProgress(string downloadUrl, CancellationToken cancellationToken) - { - var tempFile = Path.GetTempFileName() + ".zip"; - - try - { - using var response = await _httpClient.GetAsync(downloadUrl, HttpCompletionOption.ResponseHeadersRead, cancellationToken); - response.EnsureSuccessStatusCode(); - - var contentLength = response.Content.Headers.ContentLength; - UpdateProgress("开始下载更新文件...", 0); - - using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); - using var fileStream = new FileStream(tempFile, FileMode.Create); - - var buffer = new byte[8192]; - var totalBytesRead = 0L; - var lastUpdateBytes = 0L; - var updateIntervalBytes = contentLength.HasValue ? Math.Max(1024 * 1024, contentLength.Value / 100) : 1024 * 1024; - int bytesRead; - - UpdateProgress($"准备下载: {GetSizeString(contentLength ?? 0)}", 0); - - while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken)) > 0) - { - await fileStream.WriteAsync(buffer, 0, bytesRead, cancellationToken); - totalBytesRead += bytesRead; - - if (totalBytesRead - lastUpdateBytes >= updateIntervalBytes || totalBytesRead == contentLength) - { - if (contentLength.HasValue) - { - var progressPercentage = (int)((totalBytesRead * 100) / contentLength.Value); - UpdateProgress($"下载中: {progressPercentage}%", progressPercentage); - } - else - { - UpdateProgress($"下载中: {GetSizeString(totalBytesRead)}", 0); - } - - lastUpdateBytes = totalBytesRead; - } - } - - UpdateProgress("下载完成,准备更新...", 100); - return tempFile; - } - catch (OperationCanceledException) - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - throw; - } - catch (Exception ex) - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - - ShowError($"下载文件失败: {ex.Message}"); - throw; - } - } - - private string GetSizeString(long bytes) - { - if (bytes < 1024) return $"{bytes} B"; - if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; - return $"{bytes / (1024.0 * 1024):F1} MB"; - } - - private bool ValidateFile(string filePath, string expectedMd5, string expectedSha256) - { - try - { - using var md5 = MD5.Create(); - using var sha256 = SHA256.Create(); - using var stream = File.OpenRead(filePath); - - var actualMd5 = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLowerInvariant(); - stream.Position = 0; - var actualSha256 = BitConverter.ToString(sha256.ComputeHash(stream)).Replace("-", "").ToLowerInvariant(); - - return actualMd5 == expectedMd5 && actualSha256 == expectedSha256; - } - catch - { - return false; - } - } - - private void ShowProgressWindow(string message) - { - ExecuteOnUIThread(() => - { - _progressWindow = new ProgressWindow { Owner = Application.Current.MainWindow }; - _progressWindow.UpdateStatus(message); - _progressWindow.Show(); - }); - } - - private void UpdateProgress(string message, int progress) - { - ExecuteOnUIThread(() => - { - if (_progressWindow != null && _progressWindow.IsVisible) - { - _progressWindow.UpdateStatus(message); - _progressWindow.UpdateProgress(progress); - } - }); - } - - private void CloseProgressWindow() - { - ExecuteOnUIThread(() => - { - _progressWindow?.Close(); - _progressWindow = null; - }); - } - - private Task ExecuteOnUIThread(Action action) - { - if (Application.Current == null) - { - action(); - return Task.CompletedTask; - } - - if (Application.Current.Dispatcher.CheckAccess()) - { - action(); - return Task.CompletedTask; - } - else - { - return Application.Current.Dispatcher.InvokeAsync(action).Task; - } - } - - private void ShowMessage(string message) - { - ExecuteOnUIThread(() => - { - MessageBox.Show(message, "CRSim", MessageBoxButton.OK, MessageBoxImage.Information); - }); - } - - private void ShowError(string message) - { - ExecuteOnUIThread(() => - { - MessageBox.Show(message, "CRSim - Error", MessageBoxButton.OK, MessageBoxImage.Error); - }); - } - - private bool ShowQuestion(string message) - { - var result = false; - - ExecuteOnUIThread(() => - { - result = MessageBox.Show(message, "CRSim", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes; - }).Wait(); - - return result; - } - } - - public class ProgressWindow : Window - { - private readonly TextBlock _statusText; - private readonly ProgressBar _progressBar; - - public ProgressWindow() - { - Title = "更新进度"; - Width = 400; - Height = 150; - WindowStartupLocation = WindowStartupLocation.CenterOwner; - ResizeMode = ResizeMode.NoResize; - ShowInTaskbar = false; - - var stackPanel = new StackPanel { Margin = new Thickness(10) }; - - _statusText = new TextBlock - { - Text = "准备中...", - TextWrapping = TextWrapping.Wrap, - Margin = new Thickness(0, 10, 0, 20) - }; - - _progressBar = new ProgressBar - { - Minimum = 0, - Maximum = 100, - Value = 0, - Height = 20 - }; - - stackPanel.Children.Add(_statusText); - stackPanel.Children.Add(_progressBar); - - Content = stackPanel; - } - - public void UpdateStatus(string message) - { - _statusText.Text = message; - } - - public void UpdateProgress(int value) - { - _progressBar.Value = value; - } - } - - public class VersionInfo - { - public string status_code { get; set; } - public string message { get; set; } - public string ver { get; set; } - public string download_file { get; set; } - public string file_md5 { get; set; } - public string file_sha256 { get; set; } - public string log { get; set; } - } -} \ No newline at end of file diff --git a/CRSim/Views/Windows/Dialogs/TrainStopDialog.xaml.cs b/CRSim/Views/Windows/Dialogs/TrainStopDialog.xaml.cs deleted file mode 100644 index d5cfe06..0000000 --- a/CRSim/Views/Windows/Dialogs/TrainStopDialog.xaml.cs +++ /dev/null @@ -1,273 +0,0 @@ -using CRSim.Core.Models; - -namespace CRSim.Views -{ - /// - /// UserInputDialog.xaml 的交互逻辑 - /// - public partial class TrainStopDialog : Window - { - public class ticketCheck - { - public string TicketCheck { get; set; } - public bool Checked { get; set; } = false; - } - - public ObservableCollection Landmarks { get; set; } = ["无", "红色", "绿色", "褐色", "蓝色", "紫色", "黄色", "橙色"]; - - public TrainStop GeneratedTrainStop; - - public ObservableCollection TicketChecksList { get; set; } = []; - - public ObservableCollection Platforms { get; set; } = []; - - public TrainStopDialog(List ticketChecks,List platforms) - { - DataContext = this; - WindowChrome.SetWindowChrome( - this, - new WindowChrome - { - CaptionHeight = 50, - CornerRadius = default, - GlassFrameThickness = new Thickness(-1), - ResizeBorderThickness = ResizeMode == ResizeMode.NoResize ? default : new Thickness(4), - UseAeroCaptionButtons = true - } - ); - InitializeComponent(); - IntermediateStation.IsChecked = true; - LengthTextBox.Text = "16"; - TicketChecksList.Clear(); - foreach (string s in ticketChecks) - { - TicketChecksList.Add(new ticketCheck() - { - TicketCheck = s, - Checked = false - }); - } - foreach (string s in platforms) - { - Platforms.Add(s); - } - ValidateInput(); - } - - public TrainStopDialog(List ticketChecks, List platforms, TrainStop trainStop) - { - DataContext = this; - WindowChrome.SetWindowChrome( - this, - new WindowChrome - { - CaptionHeight = 50, - CornerRadius = default, - GlassFrameThickness = new Thickness(-1), - ResizeBorderThickness = ResizeMode == ResizeMode.NoResize ? default : new Thickness(4), - UseAeroCaptionButtons = true - } - ); - InitializeComponent(); - NumberTextBox.IsEnabled = false; - NumberTextBox.Text = trainStop.Number; - ArrivalTextBox.Text = trainStop.Terminal; - DepartureTextBox.Text = trainStop.Origin; - LengthTextBox.Text = trainStop.Length.ToString(); - StationKindPanel.IsEnabled = false; - if (trainStop.ArrivalTime != null) - { - StartHour.Text = trainStop.ArrivalTime.Value.Hours.ToString(); - StartMinute.Text = trainStop.ArrivalTime.Value.Minutes.ToString(); - } - else - { - StartingStation.IsChecked = true; - } - if (trainStop.DepartureTime != null) - { - EndHour.Text = trainStop.DepartureTime.Value.Hours.ToString(); - EndMinute.Text = trainStop.DepartureTime.Value.Minutes.ToString(); - } - else - { - FinalStation.IsChecked = true; - } - if(!StartingStation.IsChecked.Value && !FinalStation.IsChecked.Value) - { - IntermediateStation.IsChecked = true; - } - TicketChecksList.Clear(); - foreach (string s in ticketChecks) - { - TicketChecksList.Add(new ticketCheck() - { - TicketCheck = s, - Checked = trainStop.TicketChecks.Contains(s) - }); - } - foreach (string s in platforms) - { - Platforms.Add(s); - } - PlatformComboBox.SelectedIndex = Platforms.IndexOf(trainStop.Platform); - LandmarkComboBox.SelectedIndex = trainStop.Landmark == null ? 0 : Landmarks.IndexOf(trainStop.Landmark); - ValidateInput(); - } - - private void OkButton_Click(object sender, RoutedEventArgs e) - { - GeneratedTrainStop = new TrainStop - { - Number = NumberTextBox.Text, - Terminal = ArrivalTextBox.Text, - Origin = DepartureTextBox.Text, - ArrivalTime = StartHour.IsEnabled ? TimeSpan.Parse($"{StartHour.Text}:{StartMinute.Text}") : null, - DepartureTime = EndHour.IsEnabled ? TimeSpan.Parse($"{EndHour.Text}:{EndMinute.Text}") : null, - WaitingArea = TicketChecksList.Where(x => x.Checked).FirstOrDefault()?.TicketCheck.Split(" - ")[0] ?? string.Empty, - TicketChecks = [.. TicketChecksList.Where(x => x.Checked).Select(x => x.TicketCheck.Split(" - ")[1])], - Platform = (string)PlatformComboBox.SelectedItem, - Length = int.Parse(LengthTextBox.Text), - Landmark = (string)LandmarkComboBox.SelectedItem == "无" ? null : (string)LandmarkComboBox.SelectedItem, - }; - DialogResult = true; - Close(); - } - - private void CancelButton_Click(object sender, RoutedEventArgs e) - { - DialogResult = false; - Close(); - } - - private void StartHour_TextChanged(object sender, TextChangedEventArgs e) - { - ValidateInput(); - if (StartHour.Text.Length == 2) StartMinute.Focus(); - } - - private void StartMinute_TextChanged(object sender, TextChangedEventArgs e) - { - ValidateInput(); - if (StartMinute.Text.Length == 2) EndHour.Focus(); - } - - private void EndHour_TextChanged(object sender, TextChangedEventArgs e) - { - ValidateInput(); - if (EndHour.Text.Length == 2) EndMinute.Focus(); - } - - private void EndMinute_TextChanged(object sender, TextChangedEventArgs e) - { - ValidateInput(); - if (EndMinute.Text.Length == 2) AccentButton.Focus(); - } - - private void CheckBox_Checked(object sender, RoutedEventArgs e) - { - ValidateInput(); - } - - private void CheckBox_Unchecked(object sender, RoutedEventArgs e) - { - ValidateInput(); - } - - private static bool ValidateTime(string input, int maxValue) - { - if (!string.IsNullOrWhiteSpace(input) && int.TryParse(input, null, out int time)) - { - return 0 <= time && time < maxValue; - } - return false; - } - - private void ValidateInput() - { - // 检查四个文本框是否非空 - bool areTextBoxesFilled = - (!StartHour.IsEnabled || ValidateTime(StartHour.Text, 24)) && - (!StartMinute.IsEnabled || ValidateTime(StartMinute.Text, 60)) && - (!EndHour.IsEnabled || ValidateTime(EndHour.Text, 24)) && - (!EndMinute.IsEnabled || ValidateTime(EndMinute.Text, 60)); - - AccentButton.IsEnabled = - (!TicketChecksCheckList.IsEnabled || - (TicketChecksList.Any(x => x.Checked) && TicketChecksList.Where(x=>x.Checked).Select(x=>x.TicketCheck.Split(" - ")[0]).Distinct().Count() <= 1)) && - areTextBoxesFilled && - !string.IsNullOrWhiteSpace(NumberTextBox.Text) && - !string.IsNullOrWhiteSpace(ArrivalTextBox.Text) && - !string.IsNullOrWhiteSpace(DepartureTextBox.Text) && - int.TryParse(LengthTextBox.Text, out int i) && i > 0 && - PlatformComboBox.SelectedItem != null; - } - - private T FindVisualChild(DependencyObject obj) where T : DependencyObject - { - if (obj == null) - return null; - - for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) - { - DependencyObject child = VisualTreeHelper.GetChild(obj, i); - if (child is T t) - { - return t; - } - else - { - T childOfChild = FindVisualChild(child); - if (childOfChild != null) - return childOfChild; - } - } - return null; - } - - private void StartingStation_Checked(object sender, RoutedEventArgs e) - { - if (StartHour == null) return; - StartHour.IsEnabled = false; - StartMinute.IsEnabled = false; - EndHour.IsEnabled = true; - EndMinute.IsEnabled = true; - TicketChecksCheckList.IsEnabled = true; - } - - private void IntermediateStation_Checked(object sender, RoutedEventArgs e) - { - if (StartHour == null) return; - StartHour.IsEnabled = true; - StartMinute.IsEnabled = true; - EndHour.IsEnabled = true; - EndMinute.IsEnabled = true; - TicketChecksCheckList.IsEnabled = true; - } - - private void FinalStation_Checked(object sender, RoutedEventArgs e) - { - if (StartHour == null) return; - StartHour.IsEnabled = true; - StartMinute.IsEnabled = true; - EndHour.IsEnabled = false; - EndMinute.IsEnabled = false; - TicketChecksCheckList.IsEnabled = false; - } - - private void TicketChecksCheckList_PreviewMouseWheel(object sender, MouseWheelEventArgs e) - { - var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta) - { - RoutedEvent = UIElement.MouseWheelEvent, - Source = sender - }; - TicketChecksCheckList.RaiseEvent(eventArg); - } - - private void NumberTextBox_TextChanged(object sender, TextChangedEventArgs e) - { - ValidateInput(); - } - } -} \ No newline at end of file