From fff79ea1670dc2f7deef4a539289a3f99299b3b0 Mon Sep 17 00:00:00 2001 From: wxl0430 <141288415+wxl0430@users.noreply.github.com> Date: Sun, 15 Jun 2025 14:48:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=B7=84?= =?UTF-8?q?=E5=8D=9A=E7=AB=99=E5=87=BA=E7=AB=99=E5=8F=A3=E7=9C=8B=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Zibo/ExitScreen.png | Bin 0 -> 17063 bytes .../CRSim.ScreenSimulator.csproj | 1 + .../Converters/TrainStateColorConverter.cs | 11 + .../Converters/TrainStateConverter.cs | 2 +- .../Models/StylesInfoData.json | 11 + .../ViewModels/ScreenViewModel.cs | 9 +- .../ViewModels/Zibo/ExitScreenViewModel.cs | 48 ++++ .../Views/Zibo/ExitScreenView.xaml | 238 ++++++++++++++++++ .../Views/Zibo/ExitScreenView.xaml.cs | 18 ++ 9 files changed, 336 insertions(+), 2 deletions(-) create mode 100644 CRSim.ScreenSimulator/Assets/Zibo/ExitScreen.png create mode 100644 CRSim.ScreenSimulator/ViewModels/Zibo/ExitScreenViewModel.cs create mode 100644 CRSim.ScreenSimulator/Views/Zibo/ExitScreenView.xaml create mode 100644 CRSim.ScreenSimulator/Views/Zibo/ExitScreenView.xaml.cs diff --git a/CRSim.ScreenSimulator/Assets/Zibo/ExitScreen.png b/CRSim.ScreenSimulator/Assets/Zibo/ExitScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..034bd395061f6f7d655efb80a70f6654a536614d GIT binary patch literal 17063 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 literal 0 HcmV?d00001 diff --git a/CRSim.ScreenSimulator/CRSim.ScreenSimulator.csproj b/CRSim.ScreenSimulator/CRSim.ScreenSimulator.csproj index 68d3d6e..34c10de 100644 --- a/CRSim.ScreenSimulator/CRSim.ScreenSimulator.csproj +++ b/CRSim.ScreenSimulator/CRSim.ScreenSimulator.csproj @@ -152,6 +152,7 @@ + \ No newline at end of file diff --git a/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs b/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs index b560312..1e8c7d6 100644 --- a/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs +++ b/CRSim.ScreenSimulator/Converters/TrainStateColorConverter.cs @@ -16,9 +16,12 @@ namespace CRSim.ScreenSimulator.Converters /* Normal: 标准显示。 Alternating_Row_Colors: 候车状态隔行异色显示(第4个参数控制行号)。 + Arrive: 到达屏显示 */ public List WaitingColorList { get; set; } = []; + public SolidColorBrush ArrivedText { get; set; } = new(Colors.LightGreen); + public SolidColorBrush ArrivingText { get; set; } = new(Colors.White); public SolidColorBrush WaitingColor { get; set; } = new(Colors.White); public SolidColorBrush CheckInColor { get; set; } = new(Colors.LightGreen); public SolidColorBrush StopCheckInColor { get; set; } = new(Colors.Red); @@ -27,6 +30,14 @@ namespace CRSim.ScreenSimulator.Converters var serviceProvider = (IServiceProvider)Application.Current.Resources["ServiceProvider"]; _timeService = serviceProvider.GetRequiredService(); _settings = serviceProvider.GetRequiredService().GetSettings(); + if (DisplayMode == "Arrive" || ( values.Length > 1 && values[1] == null)) + { + if (values[0] is DateTime arriveTime) + { + return _timeService.GetDateTimeNow() >= arriveTime ? ArrivedText : ArrivingText; + } + return string.Empty; + } if (values[0] != null && values[1] == null) { return WaitingColor; diff --git a/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs b/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs index a9f3394..43c3ddf 100644 --- a/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs +++ b/CRSim.ScreenSimulator/Converters/TrainStateConverter.cs @@ -26,7 +26,7 @@ namespace CRSim.ScreenSimulator.Converters { if (values[0] is DateTime arriveTime) { - return _timeService.GetDateTimeNow() > arriveTime ? ArrivedText : ArrivingText; + return _timeService.GetDateTimeNow() >= arriveTime ? ArrivedText : ArrivingText; } return string.Empty; } diff --git a/CRSim.ScreenSimulator/Models/StylesInfoData.json b/CRSim.ScreenSimulator/Models/StylesInfoData.json index 51c562f..3587ec1 100644 --- a/CRSim.ScreenSimulator/Models/StylesInfoData.json +++ b/CRSim.ScreenSimulator/Models/StylesInfoData.json @@ -242,6 +242,17 @@ "Location" ] }, + { + "UniqueId": "Zibo.ExitScreen", + "Title": "淄博站出站口看板", + "Region": "淄博", + "Author": "wxl0430", + "Type": "出站口屏", + "Parameters": [ + "Station", + "Text" + ] + }, { "UniqueId": "Jinanxi.SmallScreen", "Title": "济南西站小屏看板", diff --git a/CRSim.ScreenSimulator/ViewModels/ScreenViewModel.cs b/CRSim.ScreenSimulator/ViewModels/ScreenViewModel.cs index f87eb34..7365baf 100644 --- a/CRSim.ScreenSimulator/ViewModels/ScreenViewModel.cs +++ b/CRSim.ScreenSimulator/ViewModels/ScreenViewModel.cs @@ -142,7 +142,14 @@ namespace CRSim.ScreenSimulator.ViewModels } } - TrainInfo = [.. TrainInfo.OrderBy(x => x.DepartureTime??x.ArrivalTime)]; + if(StationType == StationType.Arrival) + { + TrainInfo = [.. TrainInfo.OrderBy(x => x.ArrivalTime??x.DepartureTime)]; + } + else + { + TrainInfo = [.. TrainInfo.OrderBy(x => x.DepartureTime??x.ArrivalTime)]; + } RefreshData(null, null); DataLoaded.SetResult(true); } diff --git a/CRSim.ScreenSimulator/ViewModels/Zibo/ExitScreenViewModel.cs b/CRSim.ScreenSimulator/ViewModels/Zibo/ExitScreenViewModel.cs new file mode 100644 index 0000000..a600924 --- /dev/null +++ b/CRSim.ScreenSimulator/ViewModels/Zibo/ExitScreenViewModel.cs @@ -0,0 +1,48 @@ +using CRSim.Core.Services; +using CRSim.Core.Models; +using CRSim.ScreenSimulator.Models; +using System.Windows; +namespace CRSim.ScreenSimulator.ViewModels.Zibo +{ + public class ExitScreenViewModel : ScreenViewModel + { + public ExitScreenViewModel(ITimeService timeService, ISettingsService settingsService) + : base(timeService, settingsService) + { + Text = $"温馨提示:请接站的旅客在出站口外耐心等候"; + ItemsPerPage = 6; + ScreenCount = 2; + StationType = StationType.Arrival; + } + public override void RefreshDisplay(object? sender, EventArgs? e) + { + Application.Current.Dispatcher.Invoke(() => + { + int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * ScreenCount.Value)); + ScreenA.Clear(); + ScreenB.Clear(); + int startIndex = CurrentPageIndex * ItemsPerPage * ScreenCount.Value; + var ItemsToShow = TrainInfo.Skip(startIndex).Take(ItemsPerPage * ScreenCount.Value).ToList(); + var leftItems = ItemsToShow.Where((item, index) => index % 2 == 0).ToList(); + var rightItems = ItemsToShow.Where((item, index) => index % 2 == 1).ToList(); + while (leftItems.Count < ItemsPerPage) + { + leftItems.Add(new TrainInfo()); + } + while (rightItems.Count < ItemsPerPage) + { + rightItems.Add(new TrainInfo()); + } + foreach (var item in leftItems) + { + ScreenA.Add(item); + } + foreach (var item in rightItems) + { + ScreenB.Add(item); + } + CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1; + }); + } + } +} diff --git a/CRSim.ScreenSimulator/Views/Zibo/ExitScreenView.xaml b/CRSim.ScreenSimulator/Views/Zibo/ExitScreenView.xaml new file mode 100644 index 0000000..e7dfff1 --- /dev/null +++ b/CRSim.ScreenSimulator/Views/Zibo/ExitScreenView.xaml @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CRSim.ScreenSimulator/Views/Zibo/ExitScreenView.xaml.cs b/CRSim.ScreenSimulator/Views/Zibo/ExitScreenView.xaml.cs new file mode 100644 index 0000000..e0140b9 --- /dev/null +++ b/CRSim.ScreenSimulator/Views/Zibo/ExitScreenView.xaml.cs @@ -0,0 +1,18 @@ +using CRSim.ScreenSimulator.ViewModels.Zibo; +using System.Windows; +using System.Windows.Input; +using System.Windows.Media; + +namespace CRSim.ScreenSimulator.Views.Zibo +{ + public partial class ExitScreenView : BaseScreenView + { + public ExitScreenViewModel ViewModel { get; } + public ExitScreenView(ExitScreenViewModel viewModel) + { + InitializeComponent(); + ViewModel = viewModel; + DataContext = viewModel; + } + } +}