From 6596cd87777031de5cd98f5c283e0da97d3f8977 Mon Sep 17 00:00:00 2001 From: denglihong2007 <2639367181@qq.com> Date: Sun, 9 Mar 2025 15:15:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=A4=A9=E6=B4=A5?= =?UTF-8?q?=E7=AB=99=E7=AB=99=E5=8F=B0=E7=9C=8B=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 1 + .github/workflows/release.yml | 11 ++- CRSim/App.xaml.cs | 2 + .../StyleImages/Tianjin/PlatformScreen.png | Bin 0 -> 10117 bytes CRSim/Assets/StyleImages/Tianjin/image.png | Bin 0 -> 4845 bytes CRSim/CRSim.csproj | 9 +- CRSim/Converters/LocationToStringConverter.cs | 32 ++++++ CRSim/Models/StylesInfoData.json | 12 +++ .../ScreenSimulationPageViewModel.cs | 42 ++++++-- CRSim/ViewModels/Windows/ScreenViewModel.cs | 5 + .../Tianjin/PlatformScreenViewModel.cs | 41 ++++++++ .../Simulation/ScreenSimulationPage.xaml | 20 +++- .../Stations/Tianjin/PlatformScreenView.xaml | 93 ++++++++++++++++++ .../Tianjin/PlatformScreenView.xaml.cs | 33 +++++++ 14 files changed, 288 insertions(+), 13 deletions(-) create mode 100644 CRSim/Assets/StyleImages/Tianjin/PlatformScreen.png create mode 100644 CRSim/Assets/StyleImages/Tianjin/image.png create mode 100644 CRSim/Converters/LocationToStringConverter.cs create mode 100644 CRSim/ViewModels/Windows/Stations/Tianjin/PlatformScreenViewModel.cs create mode 100644 CRSim/Views/Windows/Stations/Tianjin/PlatformScreenView.xaml create mode 100644 CRSim/Views/Windows/Stations/Tianjin/PlatformScreenView.xaml.cs diff --git a/.gitattributes b/.gitattributes index 1ff0c42..74f0865 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,6 +2,7 @@ # Set default behavior to automatically normalize line endings. ############################################################################### * text=auto +*.cs text eol=lf working-tree-encoding=UTF-8 ############################################################################### # Set default behavior for command prompt diff. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8e837a0..affb177 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,11 +21,6 @@ jobs: with: fetch-depth: 0 # 获取全部提交历史以便比较标签 - - name: Setup .NET 9.0 - uses: actions/setup-dotnet@v3 - with: - dotnet-version: '9.0.x' - - name: Extract version from csproj id: get_version shell: pwsh @@ -73,6 +68,12 @@ jobs: with: dotnet-version: '9.0.x' + - name: Set Encoding + run: | + echo "DOTNET_CLI_UI_LANGUAGE=zh-CN" >> $GITHUB_ENV + chcp 65001 + + - name: Restore and Build run: | dotnet restore diff --git a/CRSim/App.xaml.cs b/CRSim/App.xaml.cs index 1bfa9b4..5e635c9 100644 --- a/CRSim/App.xaml.cs +++ b/CRSim/App.xaml.cs @@ -59,6 +59,8 @@ services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); }).Build(); [STAThread] diff --git a/CRSim/Assets/StyleImages/Tianjin/PlatformScreen.png b/CRSim/Assets/StyleImages/Tianjin/PlatformScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..3d595010867ee1b51c178990da4d2f04ad9d8453 GIT binary patch literal 10117 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 PbpZMID(|XgpdtSQ@qCZ! literal 0 HcmV?d00001 diff --git a/CRSim/Assets/StyleImages/Tianjin/image.png b/CRSim/Assets/StyleImages/Tianjin/image.png new file mode 100644 index 0000000000000000000000000000000000000000..a7bf60efc141c5d5819b4828f6d3a9dec4bcd8d4 GIT binary patch literal 4845 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.0 CRSim.App Assets\CRSimIcon.ico - 1.2.5.0 + 1.2.6.0 + + PreserveNewest @@ -42,6 +44,8 @@ + + @@ -78,6 +82,9 @@ Code + + Code + Code diff --git a/CRSim/Converters/LocationToStringConverter.cs b/CRSim/Converters/LocationToStringConverter.cs new file mode 100644 index 0000000..25d6adf --- /dev/null +++ b/CRSim/Converters/LocationToStringConverter.cs @@ -0,0 +1,32 @@ +namespace CRSim.Converters +{ + public class LocationToStringConverter : IMultiValueConverter + { + object IMultiValueConverter.Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (values[0] is int Length&& values[1] is int Location) + { + if (Location > Length) + { + return $"当前无车,1-{Length}车向后。"; + } + if (Location == Length) + { + return $"当前{Length}车,1-{Length-1}车向后。"; + } + if (Location == 1) + { + return $"当前1车,2-{Length}车向前。"; + } + return $"当前{Location}车,1-{Location - 1}车向前,{Location + 1}-{Length}车向后。"; + } + return string.Empty; + } + + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + // 通常不需要实现 ConvertBack + return null; + } + } +} diff --git a/CRSim/Models/StylesInfoData.json b/CRSim/Models/StylesInfoData.json index e1364e2..3a7f133 100644 --- a/CRSim/Models/StylesInfoData.json +++ b/CRSim/Models/StylesInfoData.json @@ -87,6 +87,18 @@ "Text" ] }, + { + "UniqueId": "Tianjin PlatformScreen", + "Title": "天津站站台看板", + "Station": "Tianjin", + "StyleName": "PlatformScreenView", + "ImagePath": "Assets/StyleImages/Tianjin/PlatformScreen.png", + "Parameters": [ + "Station", + "Platform", + "Location" + ] + }, { "UniqueId": "Zibo PrimaryScreen", "Title": "淄博站主要看板", diff --git a/CRSim/ViewModels/Pages/Simulation/ScreenSimulationPageViewModel.cs b/CRSim/ViewModels/Pages/Simulation/ScreenSimulationPageViewModel.cs index ac9e62f..666e9d0 100644 --- a/CRSim/ViewModels/Pages/Simulation/ScreenSimulationPageViewModel.cs +++ b/CRSim/ViewModels/Pages/Simulation/ScreenSimulationPageViewModel.cs @@ -28,6 +28,9 @@ public partial class ScreenSimulationPageViewModel : ObservableObject [ObservableProperty] private bool _textNeeded; + [ObservableProperty] + private bool _locationNeeded; + [ObservableProperty] private string _text = ""; @@ -37,9 +40,12 @@ public partial class ScreenSimulationPageViewModel : ObservableObject public string SelectedPlatformName = ""; + public int SelectedLoaction = 0; + public ObservableCollection StationNames { get; private set; } = []; public ObservableCollection TicketChecks { get; private set; } = []; public ObservableCollection Platforms { get; private set; } = []; + public ObservableCollection Locations { get; private set; } = []; [ObservableProperty] private bool _isStartSimulationAvailable = false; @@ -62,9 +68,10 @@ public partial class ScreenSimulationPageViewModel : ObservableObject private void CheckCanStart() { - IsStartSimulationAvailable = selectedStyle!=null && - (!StationNeeded || !string.IsNullOrWhiteSpace(SelectedStationName))&& + IsStartSimulationAvailable = selectedStyle != null && + (!StationNeeded || !string.IsNullOrWhiteSpace(SelectedStationName)) && (!TicketCheckNeeded || !string.IsNullOrWhiteSpace(SelectedTicketCheck)) && + (!LocationNeeded || SelectedLoaction != 0) && (!PlatformNeeded || !string.IsNullOrWhiteSpace(SelectedPlatformName)); } @@ -80,27 +87,31 @@ public partial class ScreenSimulationPageViewModel : ObservableObject TicketCheckNeeded = neededParameters.Contains("TicketCheck"); PlatformNeeded = neededParameters.Contains("Platform"); TextNeeded = neededParameters.Contains("Text"); + LocationNeeded = neededParameters.Contains("Location"); } CheckCanStart(); } [RelayCommand] public void SelectStation(object s) { - if(s is string station) + if(s is string v) { - SelectedStationName = station; + var station = _databaseService.GetStationByName(v); + SelectedStationName = station.Name; SelectedPlatformName = ""; SelectedTicketCheck = ""; + SelectedLoaction = 0; TicketChecks.Clear(); - foreach(string ticketCheck in _databaseService.GetStationByName(SelectedStationName).TicketChecks) + foreach(string ticketCheck in station.TicketChecks) { TicketChecks.Add(ticketCheck); } Platforms.Clear(); - foreach (var platform in _databaseService.GetStationByName(SelectedStationName).Platforms) + foreach (var platform in station.Platforms) { Platforms.Add(platform); } + Locations.Clear(); } CheckCanStart(); } @@ -114,11 +125,26 @@ public partial class ScreenSimulationPageViewModel : ObservableObject CheckCanStart(); } [RelayCommand] + public void SelectLocation(object s) + { + if (s is int location) + { + SelectedLoaction = location; + } + CheckCanStart(); + } + [RelayCommand] public void SelectPlatform(object s) { if (s is Platform platform) { SelectedPlatformName = platform.Name; + SelectedLoaction = 0; + Locations.Clear(); + for (int i = 1; i <= platform.Length; i++) + { + Locations.Add(i); + } } CheckCanStart(); } @@ -131,6 +157,10 @@ public partial class ScreenSimulationPageViewModel : ObservableObject { Window.ViewModel.Text = Text; } + if (LocationNeeded && SelectedLoaction != 0) + { + Window.ViewModel.Location = SelectedLoaction; + } Window.ViewModel.LoadData(_databaseService.GetStationByName(SelectedStationName), TicketCheckNeeded ? SelectedTicketCheck : string.Empty, diff --git a/CRSim/ViewModels/Windows/ScreenViewModel.cs b/CRSim/ViewModels/Windows/ScreenViewModel.cs index 0598b3c..26a1ae3 100644 --- a/CRSim/ViewModels/Windows/ScreenViewModel.cs +++ b/CRSim/ViewModels/Windows/ScreenViewModel.cs @@ -14,7 +14,11 @@ namespace CRSim.ViewModels [ObservableProperty] private string _text = ""; [ObservableProperty] + public int _location; + [ObservableProperty] private Station _thisStation; + [ObservableProperty] + private string _thisPlatform; public event PropertyChangedEventHandler PropertyChanged; public List TrainInfo { get; set; } = []; @@ -55,6 +59,7 @@ namespace CRSim.ViewModels public void LoadData(Station station,string ticketCheck,string platform) { ThisStation = station; + ThisPlatform = platform; var trains = station.StationStops; foreach (var trainNumber in trains) { diff --git a/CRSim/ViewModels/Windows/Stations/Tianjin/PlatformScreenViewModel.cs b/CRSim/ViewModels/Windows/Stations/Tianjin/PlatformScreenViewModel.cs new file mode 100644 index 0000000..19958ca --- /dev/null +++ b/CRSim/ViewModels/Windows/Stations/Tianjin/PlatformScreenViewModel.cs @@ -0,0 +1,41 @@ +namespace CRSim.ViewModels.Tianjin +{ + public class PlatformScreenViewModel : ScreenViewModel + { + private ITimeService _timeService; + public ObservableCollection Screen { get; set; } = []; + public PlatformScreenViewModel(ITimeService timeService, ISettingsService settingsService) + : base(timeService, settingsService) + { + _timeService = timeService; + timeService.RefreshSecondsElapsed += RefreshDisplay; + Initialize(); + } + private async void Initialize() + { + await WaitForDataLoadAsync(); + Text = ThisPlatform; + RefreshDisplay(null,null); + } + private void RefreshDisplay(object? sender, EventArgs e) + { + Application.Current.Dispatcher.Invoke(() => + { + Screen.Add(TrainInfo.Count > 0 ? TrainInfo[0] : new()); + if (Screen.Count == 1) return; + Screen.RemoveAt(0); + }); + } + public override void RefreshData(object? sender, EventArgs e) + { + if (CurrentPageIndex == 0) + { + List itemsToRemove = [.. TrainInfo.Where(info => info.DepartureTime < _timeService.GetDateTimeNow())]; + foreach (var item in itemsToRemove) + { + TrainInfo.Remove(item); + } + } + } + } +} diff --git a/CRSim/Views/Pages/Simulation/ScreenSimulationPage.xaml b/CRSim/Views/Pages/Simulation/ScreenSimulationPage.xaml index 089f0b2..2184a32 100644 --- a/CRSim/Views/Pages/Simulation/ScreenSimulationPage.xaml +++ b/CRSim/Views/Pages/Simulation/ScreenSimulationPage.xaml @@ -125,7 +125,6 @@ - @@ -144,6 +143,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/CRSim/Views/Windows/Stations/Tianjin/PlatformScreenView.xaml b/CRSim/Views/Windows/Stations/Tianjin/PlatformScreenView.xaml new file mode 100644 index 0000000..b49c1de --- /dev/null +++ b/CRSim/Views/Windows/Stations/Tianjin/PlatformScreenView.xaml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CRSim/Views/Windows/Stations/Tianjin/PlatformScreenView.xaml.cs b/CRSim/Views/Windows/Stations/Tianjin/PlatformScreenView.xaml.cs new file mode 100644 index 0000000..7c1c9ab --- /dev/null +++ b/CRSim/Views/Windows/Stations/Tianjin/PlatformScreenView.xaml.cs @@ -0,0 +1,33 @@ +using CRSim.ViewModels.Tianjin; + +namespace CRSim.Views.Tianjin +{ + /// + /// SecondaryScreen.xaml 的交互逻辑 + /// + public partial class PlatformScreenView : Window + { + public PlatformScreenViewModel ViewModel { get; } + public PlatformScreenView(PlatformScreenViewModel viewModel) + { + InitializeComponent(); + ViewModel = viewModel; + DataContext = viewModel; + } + private void Window_MouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) + { + DragMove(); + } + } + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) + { + Close(); + } + } + } +}