refactor: #154 为样式的ViewModel构建基类以减少重复代码

This commit is contained in:
denglihong2007
2025-05-18 21:36:46 +08:00
parent 9640997115
commit 1b72ddd73f
43 changed files with 157 additions and 956 deletions

View File

@@ -1,79 +1,16 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using CRSim.Core.Models;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Ankang
{
public class ExitScreenViewModel : ScreenViewModel
{
private ITimeService _timeService;
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public ObservableCollection<TrainInfo> RightScreen { get; private set; } = [];
public ExitScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
_timeService = timeService;
Text = $"西安局集团公司推出西铁行APP站车服务产品欢迎体验使用。";
ItemsPerPage = 7;
PageCount = 1;
StationType = StationType.Arrival;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
LeftScreen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var leftItems = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (leftItems.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
leftItems.Add(new TrainInfo());
}
foreach (var item in leftItems)
{
LeftScreen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
public override void RefreshData(object? sender, EventArgs e)
{
if (CurrentPageIndex == 0)
{
List<TrainInfo> itemsToRemove = [];
foreach (TrainInfo trainInfo in TrainInfo)
{
if (trainInfo.DepartureTime == null)
{
if (trainInfo.ArrivalTime.Value.Add(_settings.StopDisplayFromArrivalDuration) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
else
{
if (trainInfo.DepartureTime.Value < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
}
foreach (var item in itemsToRemove)
{
TrainInfo.Remove(item);
}
}
}
}
}

View File

@@ -1,63 +1,14 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Beijing
{
public class ArrivalScreenViewModel : ScreenViewModel
{
private ITimeService _timeService;
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public ArrivalScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
_timeService = timeService;
StationType = StationType.Arrival;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
ItemsPerPage = 2;
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
Screen.Clear();
for (int i = 0; i < ItemsPerPage; i++)
{
Screen.Add(TrainInfo.Count > i ? TrainInfo[i] : new());
}
});
}
public override void RefreshData(object? sender, EventArgs e)
{
List<TrainInfo> itemsToRemove = [];
foreach (TrainInfo trainInfo in TrainInfo)
{
if (trainInfo.DepartureTime == null)
{
if (trainInfo.ArrivalTime.Value.Add(_settings.StopDisplayFromArrivalDuration) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
else
{
if (trainInfo.DepartureTime.Value < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
}
foreach (var item in itemsToRemove)
{
TrainInfo.Remove(item);
}
StationType = StationType.Arrival;
}
}
}

View File

@@ -1,59 +1,15 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.BeijingXi
{
public class PrimaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public ObservableCollection<TrainInfo> RightScreen { get; private set; } = [];
public PrimaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
ItemsPerPage = 13;
PageCount = 2;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
LeftScreen.Clear();
RightScreen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var leftItems = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (leftItems.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
leftItems.Add(new TrainInfo());
}
foreach (var item in leftItems)
{
LeftScreen.Add(item);
}
// Get the slice for the right screen (next 12)
var rightItems = TrainInfo.Skip(startIndex + ItemsPerPage).Take(ItemsPerPage).ToList();
while (rightItems.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
rightItems.Add(new TrainInfo());
}
foreach (var item in rightItems)
{
RightScreen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -17,15 +17,8 @@ namespace CRSim.ScreenSimulator.ViewModels.ChengduDong
: base(timeService, settingsService)
{
StationType = StationType.Departure;
timeService.OneSecondElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null, null);
}
private void RefreshDisplay(object? sender, EventArgs e)
public override void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{

View File

@@ -1,37 +1,15 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.ChengduDong
{
public class PrimaryTicketCheckScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public PrimaryTicketCheckScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
Text = "持户口簿、护照、临时身份证的旅客,请在非居民身份证通道排队。请主动礼让老、弱、病、残、孕的旅客。";
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
ItemsPerPage = 2;
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
Screen.Clear();
for (int i = 0; i < ItemsPerPage; i++)
{
Screen.Add(TrainInfo.Count > i ? TrainInfo[i] : new());
}
});
StationType = StationType.Departure;
}
}
}

View File

@@ -1,14 +1,9 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using System.Windows;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
namespace CRSim.ScreenSimulator.ViewModels.ChengduDong
{
public class SecondaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public ObservableCollection<TrainInfo> RightScreen { get; private set; } = [];
public SecondaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
@@ -16,42 +11,6 @@ namespace CRSim.ScreenSimulator.ViewModels.ChengduDong
ItemsPerPage = 12;
PageCount = 2;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
LeftScreen.Clear();
RightScreen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var leftItems = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (leftItems.Count < ItemsPerPage)
{
leftItems.Add(new TrainInfo());
}
foreach (var item in leftItems)
{
LeftScreen.Add(item);
}
var rightItems = TrainInfo.Skip(startIndex + ItemsPerPage).Take(ItemsPerPage).ToList();
while (rightItems.Count < ItemsPerPage)
{
rightItems.Add(new TrainInfo());
}
foreach (var item in rightItems)
{
RightScreen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -1,36 +1,15 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.DaqingDong
{
public class ConcourseBridgeScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public ConcourseBridgeScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
ItemsPerPage = 3;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
ItemsPerPage = 3;
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
Screen.Clear();
for (int i = 0; i < ItemsPerPage; i++)
{
Screen.Add(TrainInfo.Count > i ? TrainInfo[i] : new());
}
});
}
}
}

View File

@@ -1,62 +1,13 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.DaqingDong
{
public class PlatformScreenViewModel : ScreenViewModel
{
private ITimeService _timeService;
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public PlatformScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
_timeService = timeService;
timeService.RefreshSecondsElapsed += RefreshDisplay;
ItemsPerPage = 1;
Text = $"请站在白色安全线以内排队候车";
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
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<TrainInfo> itemsToRemove = [];
foreach (TrainInfo trainInfo in TrainInfo)
{
if (trainInfo.DepartureTime == null)
{
if (trainInfo.ArrivalTime.Value.Add(_settings.StopDisplayFromArrivalDuration) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
else
{
if (trainInfo.DepartureTime.Value < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
}
foreach (var item in itemsToRemove)
{
TrainInfo.Remove(item);
}
}
}
}
}

View File

@@ -1,37 +1,15 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using CRSim.Core.Models;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Fuzhou
{
public class TicketCheckScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public TicketCheckScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
Text = $"开车前{settingsService.GetSettings().StopCheckInAdvanceDuration.TotalMinutes}分钟停止检票";
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
ItemsPerPage = 4;
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
Screen.Clear();
for (int i = 0; i < ItemsPerPage; i++)
{
Screen.Add(TrainInfo.Count > i ? TrainInfo[i] : new());
}
});
StationType = StationType.Departure;
}
}
}

View File

@@ -1,37 +1,15 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using CRSim.Core.Models;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.FuzhouNan
{
public class TicketCheckScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public TicketCheckScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
Text = $"开车前{settingsService.GetSettings().StopCheckInAdvanceDuration.TotalMinutes}分钟停止检票";
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
ItemsPerPage = 6;
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
Screen.Clear();
for (int i = 0; i < ItemsPerPage; i++)
{
Screen.Add(TrainInfo.Count > i ? TrainInfo[i] : new());
}
});
StationType = StationType.Departure;
}
}
}

View File

@@ -1,45 +1,14 @@
using System.Windows;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using CRSim.Core.Services;
namespace CRSim.ScreenSimulator.ViewModels.GuangdongIntercity
{
public class SecondaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; private set; } = [];
public SecondaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
Text = $"列 车 到 发 信 息";
ItemsPerPage = 8;
PageCount = 1;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Text = $"列 车 到 发 信 息";
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
Screen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var Items = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (Items.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
Items.Add(new TrainInfo());
}
foreach (var item in Items)
{
Screen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -1,13 +1,9 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
using CRSim.Core.Models;
namespace CRSim.ScreenSimulator.ViewModels.Guangyuan
{
public class PrimaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; private set; } = [];
public PrimaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
@@ -15,32 +11,6 @@ namespace CRSim.ScreenSimulator.ViewModels.Guangyuan
ItemsPerPage = 12;
PageCount = 1;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
Screen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var items = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (items.Count < ItemsPerPage)
{
items.Add(new TrainInfo());
}
foreach (var item in items)
{
Screen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -1,62 +1,13 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Hanzhong
{
public class PlatformScreenViewModel : ScreenViewModel
{
private ITimeService _timeService;
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public PlatformScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
_timeService = timeService;
timeService.RefreshSecondsElapsed += RefreshDisplay;
ItemsPerPage = 1;
Text = "请注意列车与站台之间的间隙,请勿携带危险品上车";
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
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<TrainInfo> itemsToRemove = [];
foreach (TrainInfo trainInfo in TrainInfo)
{
if (trainInfo.DepartureTime == null)
{
if (trainInfo.ArrivalTime.Value.Add(_settings.StopDisplayFromArrivalDuration) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
else
{
if (trainInfo.DepartureTime.Value < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
}
foreach (var item in itemsToRemove)
{
TrainInfo.Remove(item);
}
}
}
}
}
}

View File

@@ -1,14 +1,9 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Harbin
{
public class PrimaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public ObservableCollection<TrainInfo> RightScreen { get; private set; } = [];
public PrimaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
@@ -16,45 +11,6 @@ namespace CRSim.ScreenSimulator.ViewModels.Harbin
ItemsPerPage = 6;
PageCount = 2;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
LeftScreen.Clear();
RightScreen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var leftItems = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (leftItems.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
leftItems.Add(new TrainInfo());
}
foreach (var item in leftItems)
{
LeftScreen.Add(item);
}
// Get the slice for the right screen (next 12)
var rightItems = TrainInfo.Skip(startIndex + ItemsPerPage).Take(ItemsPerPage).ToList();
while (rightItems.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
rightItems.Add(new TrainInfo());
}
foreach (var item in rightItems)
{
RightScreen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -1,62 +1,13 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.HarbinXi
{
public class PlatformScreenViewModel : ScreenViewModel
{
private ITimeService _timeService;
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public PlatformScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
_timeService = timeService;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Text = $"请在白线内行走,乘降列车时注意脚下站台与列车之间的空隙,看护好老人和儿童。";
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
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<TrainInfo> itemsToRemove = [];
foreach (TrainInfo trainInfo in TrainInfo)
{
if (trainInfo.DepartureTime == null)
{
if (trainInfo.ArrivalTime.Value.Add(_settings.StopDisplayFromArrivalDuration) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
else
{
if (trainInfo.DepartureTime.Value < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
}
foreach (var item in itemsToRemove)
{
TrainInfo.Remove(item);
}
}
ItemsPerPage = 1;
}
}
}

View File

@@ -1,47 +1,21 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Jinanxi
{
public class SmallScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; private set; } = [];
public SmallScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
ItemsPerPage = 9;
PageCount = 1;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
SetText();
}
private async void Initialize()
private async Task SetText()
{
await WaitForDataLoadAsync();
await DataLoaded.Task;
Text = $"{string.Join(" ", ThisStation.Name.ToCharArray())} 站 欢 迎 您";
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
Screen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var Items = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (Items.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
Items.Add(new TrainInfo());
}
foreach (var item in Items)
{
Screen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -1,62 +1,12 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Mianyang
{
public class PlatformScreenViewModel : ScreenViewModel
{
private ITimeService _timeService;
public ObservableCollection<TrainInfo> 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<TrainInfo> itemsToRemove = [];
foreach (TrainInfo trainInfo in TrainInfo)
{
if (trainInfo.DepartureTime == null)
{
if (trainInfo.ArrivalTime.Value.Add(_settings.StopDisplayFromArrivalDuration) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
else
{
if (trainInfo.DepartureTime.Value < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
}
foreach (var item in itemsToRemove)
{
TrainInfo.Remove(item);
}
}
ItemsPerPage = 1;
}
}
}

View File

@@ -1,13 +1,9 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Niuzhou
{
public class PrimaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public PrimaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
@@ -15,32 +11,6 @@ namespace CRSim.ScreenSimulator.ViewModels.Niuzhou
ItemsPerPage = 10;
PageCount = 1;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
LeftScreen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var leftItems = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (leftItems.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
leftItems.Add(new TrainInfo());
}
foreach (var item in leftItems)
{
LeftScreen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -2,7 +2,8 @@
using CRSim.Core.Services;
using CRSim.Core.Models;
using CRSim.ScreenSimulator.Models;
using System.ComponentModel;
using System.Windows;
using System.Collections.ObjectModel;
namespace CRSim.ScreenSimulator.ViewModels
{
@@ -10,7 +11,7 @@ namespace CRSim.ScreenSimulator.ViewModels
{
public readonly ITimeService _timeService;
public readonly Settings _settings;
private readonly TaskCompletionSource<bool> _dataLoaded = new();
public readonly TaskCompletionSource<bool> DataLoaded = new();
[ObservableProperty]
private DateTime _currentTime = new();
[ObservableProperty]
@@ -23,6 +24,8 @@ namespace CRSim.ScreenSimulator.ViewModels
private string _thisPlatform;
[ObservableProperty]
private string _thisTicketCheck;
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public ObservableCollection<TrainInfo> RightScreen { get; private set; } = [];
public List<TrainInfo> TrainInfo { get; set; } = [];
@@ -35,15 +38,27 @@ namespace CRSim.ScreenSimulator.ViewModels
_settings = settingsService.GetSettings();
_timeService.OneSecondElapsed += OnTimeElapsed;
_timeService.RefreshSecondsElapsed += RefreshData;
_timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
public int CurrentPageIndex = 0;
public int ItemsPerPage;
public int PageCount;
public int ItemsPerPage = 1;
public virtual void RefreshData(object? sender, EventArgs e)
//<summary>
// 适用于翻页屏的屏幕个数参数,非翻页屏请不要设置。
//</summary>
public int? PageCount = null;
private async void Initialize()
{
if (CurrentPageIndex==0)
await DataLoaded.Task;
RefreshDisplay(null, null);
}
public void RefreshData(object? sender, EventArgs e)
{
if (CurrentPageIndex == 0)
{
List<TrainInfo> itemsToRemove = [];
foreach(TrainInfo trainInfo in TrainInfo)
@@ -57,7 +72,7 @@ namespace CRSim.ScreenSimulator.ViewModels
}
else
{
if (trainInfo.DepartureTime.Value.Subtract(_settings.StopDisplayUntilDepartureDuration) < _timeService.GetDateTimeNow())
if ((StationType == StationType.Arrival || StationType == StationType.Both ? trainInfo.DepartureTime.Value : trainInfo.DepartureTime.Value.Subtract(_settings.StopDisplayUntilDepartureDuration)) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
@@ -75,8 +90,6 @@ namespace CRSim.ScreenSimulator.ViewModels
CurrentTime = _timeService.GetDateTimeNow();
}
public Task WaitForDataLoadAsync() => _dataLoaded.Task;
public void LoadData(Station station, string ticketCheck, string platform)
{
ThisStation = station;
@@ -125,7 +138,76 @@ namespace CRSim.ScreenSimulator.ViewModels
}
TrainInfo = [.. TrainInfo.OrderBy(x => x.DepartureTime??x.ArrivalTime)];
RefreshData(null, null);
_dataLoaded.SetResult(true);
DataLoaded.SetResult(true);
}
public virtual void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
if (PageCount == null)
{
for (int i = 0; i < ItemsPerPage; i++)
{
LeftScreen.Add(TrainInfo.Count > i ? TrainInfo[i] : new());
}
if(LeftScreen.Count > ItemsPerPage)
{
for (int i = 0; i < ItemsPerPage; i++)
{
LeftScreen.RemoveAt(0);
}
}
return;
}
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount.Value));
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount.Value;
switch (PageCount)
{
case 1:
{
LeftScreen.Clear();
var items = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (items.Count < ItemsPerPage)
{
items.Add(new TrainInfo());
}
foreach (var item in items)
{
LeftScreen.Add(item);
}
break;
}
case 2:
{
LeftScreen.Clear();
RightScreen.Clear();
var leftItems = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (leftItems.Count < ItemsPerPage)
{
leftItems.Add(new TrainInfo());
}
foreach (var item in leftItems)
{
LeftScreen.Add(item);
}
var rightItems = TrainInfo.Skip(startIndex + ItemsPerPage).Take(ItemsPerPage).ToList();
while (rightItems.Count < ItemsPerPage)
{
rightItems.Add(new TrainInfo());
}
foreach (var item in rightItems)
{
RightScreen.Add(item);
}
break;
}
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}

View File

@@ -1,45 +1,15 @@
using CRSim.Core.Services;
using CRSim.Core.Models;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Shanghai
{
public class OutsideScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; private set; } = [];
public OutsideScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
ItemsPerPage = 9;
PageCount = 1;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
Screen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var items = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (items.Count < ItemsPerPage)
{
items.Add(new TrainInfo());
}
foreach (var item in items)
{
Screen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -1,62 +1,12 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Tianjin
{
public class PlatformScreenViewModel : ScreenViewModel
{
private ITimeService _timeService;
public ObservableCollection<TrainInfo> 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<TrainInfo> itemsToRemove = [];
foreach (TrainInfo trainInfo in TrainInfo)
{
if (trainInfo.DepartureTime == null)
{
if (trainInfo.ArrivalTime.Value.Add(_settings.StopDisplayFromArrivalDuration) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
else
{
if (trainInfo.DepartureTime.Value < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
}
foreach (var item in itemsToRemove)
{
TrainInfo.Remove(item);
}
}
ItemsPerPage = 1;
}
}
}

View File

@@ -1,36 +1,14 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Zibo
{
public class ConcourseBridgeScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public ConcourseBridgeScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
ItemsPerPage = 2;
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
Screen.Clear();
for (int i = 0; i < ItemsPerPage; i++)
{
Screen.Add(TrainInfo.Count > i ? TrainInfo[i] : new());
}
});
}
}
}

View File

@@ -1,62 +1,13 @@
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Zibo
{
public class PlatformScreenViewModel : ScreenViewModel
{
private ITimeService _timeService;
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public PlatformScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
_timeService = timeService;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Text = $"请站在白色安全线以内排队候车";
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
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<TrainInfo> itemsToRemove = [];
foreach (TrainInfo trainInfo in TrainInfo)
{
if (trainInfo.DepartureTime == null)
{
if (trainInfo.ArrivalTime.Value.Add(_settings.StopDisplayFromArrivalDuration) < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
else
{
if (trainInfo.DepartureTime.Value < _timeService.GetDateTimeNow())
{
itemsToRemove.Add(trainInfo);
}
}
}
foreach (var item in itemsToRemove)
{
TrainInfo.Remove(item);
}
}
ItemsPerPage = 1;
}
}
}

View File

@@ -1,56 +1,15 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Zibo
{
public class PrimaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public ObservableCollection<TrainInfo> RightScreen { get; private set; } = [];
public PrimaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
ItemsPerPage = 8;
PageCount = 2;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
LeftScreen.Clear();
RightScreen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var leftItems = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (leftItems.Count < ItemsPerPage)
{
leftItems.Add(new TrainInfo());
}
foreach (var item in leftItems)
{
LeftScreen.Add(item);
}
var rightItems = TrainInfo.Skip(startIndex + ItemsPerPage).Take(ItemsPerPage).ToList();
while (rightItems.Count < ItemsPerPage)
{
rightItems.Add(new TrainInfo());
}
foreach (var item in rightItems)
{
RightScreen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -1,13 +1,9 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Windows;
using System.Collections.ObjectModel;
namespace CRSim.ScreenSimulator.ViewModels.Zibo
{
public class SecondaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; private set; } = [];
public SecondaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
@@ -15,32 +11,6 @@ namespace CRSim.ScreenSimulator.ViewModels.Zibo
ItemsPerPage = 18;
PageCount = 1;
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
Screen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var Items = TrainInfo.Skip(startIndex).Take(ItemsPerPage).ToList();
while (Items.Count < ItemsPerPage) // Fill up with new object() if not enough items
{
Items.Add(new TrainInfo());
}
foreach (var item in Items)
{
Screen.Add(item);
}
CurrentPageIndex = CurrentPageIndex + 1 >= Math.Min(_settings.MaxPages, pageCount) ? 0 : CurrentPageIndex + 1;
});
}
}
}

View File

@@ -1,38 +1,28 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.Zibo
{
public class TicketCheckScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public ObservableCollection<TrainInfo> RightScreen { get; private set; } = [];
public TicketCheckScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
Text = $" 开车前{settingsService.GetSettings().StopCheckInAdvanceDuration.TotalMinutes}分钟停止检票";
StationType = StationType.Departure;
timeService.RefreshSecondsElapsed += RefreshDisplay;
Initialize();
}
private async void Initialize()
{
ItemsPerPage = 5;
PageCount = 2;
await WaitForDataLoadAsync();
RefreshDisplay(null,null);
}
private void RefreshDisplay(object? sender, EventArgs? e)
public override void RefreshDisplay(object? sender, EventArgs? e)
{
Application.Current.Dispatcher.Invoke(() =>
{
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount));
int pageCount = (int)Math.Ceiling((double)TrainInfo.Count / (ItemsPerPage * PageCount.Value));
LeftScreen.Clear();
RightScreen.Clear();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount;
var ItemsToShow = TrainInfo.Skip(startIndex).Take(ItemsPerPage * PageCount).ToList();
int startIndex = CurrentPageIndex * ItemsPerPage * PageCount.Value;
var ItemsToShow = TrainInfo.Skip(startIndex).Take(ItemsPerPage * PageCount.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)