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)

View File

@@ -41,7 +41,7 @@
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding Screen}" AutoGenerateColumns="False" BorderThickness="0"
<DataGrid ItemsSource="{Binding LeftScreen}" AutoGenerateColumns="False" BorderThickness="0"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="34" Foreground="White"

View File

@@ -28,7 +28,7 @@
<converters1:DateTimeToStringConverter x:Key="DateTimeToStringConverter" Format="HH:mm" />
</Window.Resources>
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding Screen}" AutoGenerateColumns="False"
<DataGrid ItemsSource="{Binding LeftScreen}" AutoGenerateColumns="False"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False" ClipToBounds="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="28" Foreground="White"

View File

@@ -39,7 +39,7 @@
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding Screen}" AutoGenerateColumns="False" BorderThickness="0"
<DataGrid ItemsSource="{Binding LeftScreen}" AutoGenerateColumns="False" BorderThickness="0"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False" ClipToBounds="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="34" Foreground="White"

View File

@@ -36,20 +36,20 @@
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="{Binding Screen[0].TrainNumber}" VerticalAlignment="Center" TextAlignment="Left"/>
<TextBlock Grid.Column="0" Grid.Row="0" Text="{Binding LeftScreen[0].TrainNumber}" VerticalAlignment="Center" TextAlignment="Left"/>
<TextBlock Grid.Column="1" Grid.Row="0" Text="次" Margin="4,0,0,0" VerticalAlignment="Center" TextAlignment="Left"/>
<TextBlock Grid.Column="3" Grid.Row="0" Text="本站" Foreground="#de502b" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Column="5" Grid.Row="0" Text="{Binding Screen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" VerticalAlignment="Center" TextAlignment="Right"/>
<TextBlock Grid.Column="5" Grid.Row="0" Text="{Binding LeftScreen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" VerticalAlignment="Center" TextAlignment="Right"/>
<TextBlock Grid.Column="6" Grid.Row="0" Text="开" Margin="4,0,0,0" VerticalAlignment="Center" TextAlignment="Right"/>
<TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Text="{Binding Screen[0].Origin}" VerticalAlignment="Center" TextAlignment="Left"/>
<TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Text="{Binding LeftScreen[0].Origin}" VerticalAlignment="Center" TextAlignment="Left"/>
<TextBlock Grid.Column="3" Grid.Row="1" Text="开往" Foreground="#de502b" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Column="5" Grid.ColumnSpan="2" Grid.Row="1" Text="{Binding Screen[0].Terminal}" VerticalAlignment="Center" TextAlignment="Right"/>
<TextBlock Grid.Column="5" Grid.ColumnSpan="2" Grid.Row="1" Text="{Binding LeftScreen[0].Terminal}" VerticalAlignment="Center" TextAlignment="Right"/>
<pp:RunningText Speed="20" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="7">
<pp:RunningText.Text>
<MultiBinding Mode="OneWay" Converter="{StaticResource LocationToStringConverter}">
<Binding Path="Screen[0].Length" />
<Binding Path="LeftScreen[0].Length" />
<Binding Path="Location" />
</MultiBinding>
</pp:RunningText.Text>

View File

@@ -45,7 +45,7 @@
</Grid>
</StackPanel>
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding Screen}" AutoGenerateColumns="False" BorderThickness="0.1"
<DataGrid ItemsSource="{Binding LeftScreen}" AutoGenerateColumns="False" BorderThickness="0.1"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False" ClipToBounds="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="28" Foreground="White"

View File

@@ -49,7 +49,7 @@
</Grid>
</StackPanel>
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding Screen}" AutoGenerateColumns="False" BorderThickness="0.1"
<DataGrid ItemsSource="{Binding LeftScreen}" AutoGenerateColumns="False" BorderThickness="0.1"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False" ClipToBounds="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="28" Foreground="White"

View File

@@ -94,7 +94,7 @@
</Grid>
</Grid>
<DataGrid ItemsSource="{Binding Screen, Mode=OneWay}" AutoGenerateColumns="False"
<DataGrid ItemsSource="{Binding LeftScreen, Mode=OneWay}" AutoGenerateColumns="False"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="35"

View File

@@ -27,7 +27,7 @@
<converters:TrainStateConverter x:Key="TrainStateConverter" WaitingText="正点"/>
</Window.Resources>
<StackPanel Orientation="Horizontal">
<DataGrid ItemsSource="{Binding Screen}" AutoGenerateColumns="False"
<DataGrid ItemsSource="{Binding LeftScreen}" AutoGenerateColumns="False"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="28" Foreground="#D75B41"

View File

@@ -35,11 +35,11 @@
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Foreground="#0089FF" Text="{Binding Screen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" FontSize="32" Margin="64,0,0,0" FontWeight="Bold"/>
<TextBlock Grid.Column="0" Foreground="#0089FF" Text="{Binding LeftScreen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" FontSize="32" Margin="64,0,0,0" FontWeight="Bold"/>
<TextBlock Grid.Column="1" Foreground="#0089FF" Text="开" FontSize="32" Margin="4,0,8,0" FontWeight="Bold"/>
<Image Grid.Column="2" Source="pack://application:,,,/CRSim.ScreenSimulator;component/Assets/Hanzhong/Image.png" Height="{Binding ActualHeight,ElementName=Panel}"/>
<Rectangle Grid.Column="3" Fill="#0089FF" Height="{Binding ActualHeight,ElementName=Panel}"/>
<TextBlock Grid.Column="4" Text="{Binding Screen[0].TrainNumber}" Foreground="#FE5649" Background="#0089FF" FontSize="32" FontWeight="Bold"/>
<TextBlock Grid.Column="4" Text="{Binding LeftScreen[0].TrainNumber}" Foreground="#FE5649" Background="#0089FF" FontSize="32" FontWeight="Bold"/>
<Rectangle Grid.Column="5" Fill="#0089FF" Height="{Binding ActualHeight,ElementName=Panel}" Width="8"/>
<TextBlock Grid.Column="6" Text="次" Foreground="#FE5649" Background="#0089FF" FontSize="32" FontWeight="Bold"/>
<Rectangle Grid.Column="7" Fill="#0089FF" Height="{Binding ActualHeight,ElementName=Panel}" Width="52"/>
@@ -51,7 +51,7 @@
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" TextAlignment="Center" Text="{Binding Screen[0].Origin}" FontSize="36" Foreground="#09F2F6" FontWeight="Bold"/>
<TextBlock Grid.Column="0" TextAlignment="Center" Text="{Binding LeftScreen[0].Origin}" FontSize="36" Foreground="#09F2F6" FontWeight="Bold"/>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
@@ -70,7 +70,7 @@
<Polygon Points="0,0 0,10 8.66,5" Fill="#FDB441" Margin="2.5"/>
</StackPanel>
</Grid>
<TextBlock Grid.Column="2" TextAlignment="Center" Text="{Binding Screen[0].Terminal}" FontSize="36" Foreground="#09F2F6" FontWeight="Bold"/>
<TextBlock Grid.Column="2" TextAlignment="Center" Text="{Binding LeftScreen[0].Terminal}" FontSize="36" Foreground="#09F2F6" FontWeight="Bold"/>
</Grid>
<TextBlock Grid.Row="2" TextAlignment="Center" Foreground="White" Text="{Binding Text}" Margin="0,5"/>
</Grid>

View File

@@ -39,18 +39,18 @@
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Screen[0].TrainNumber}" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding LeftScreen[0].TrainNumber}" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="次" Margin="4,0,0,0" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="4" Text="本站" Foreground="#de502b" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="6" Text="{Binding Screen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="6" Text="{Binding LeftScreen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="7" Text="开" Margin="4,0,0,0" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Text="{Binding Screen[0].Origin}" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Text="{Binding LeftScreen[0].Origin}" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="1" Grid.Column="4" Text="开往" Foreground="#de502b" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="1" Grid.Column="6" Grid.ColumnSpan="2" Text="{Binding Screen[0].Terminal}" VerticalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="1" Grid.Column="6" Grid.ColumnSpan="2" Text="{Binding LeftScreen[0].Terminal}" VerticalAlignment="Center" TextAlignment="Center"/>
<pp:RunningText Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="9" Speed="20">
<pp:RunningText.Text>
<MultiBinding Mode="OneWay" Converter="{StaticResource LocationToStringConverter}">
<Binding Path="Screen[0].Length" />
<Binding Path="LeftScreen[0].Length" />
<Binding Path="Location" />
</MultiBinding>
</pp:RunningText.Text>

View File

@@ -107,7 +107,7 @@
</Canvas>
</Grid>
<DataGrid ItemsSource="{Binding Screen, Mode=OneWay}" AutoGenerateColumns="False"
<DataGrid ItemsSource="{Binding LeftScreen, Mode=OneWay}" AutoGenerateColumns="False"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="28"

View File

@@ -40,11 +40,11 @@
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="←" Foreground="LightYellow" Margin="4,0,0,0" FontFamily="黑体"/>
<TextBlock Text="{Binding Screen[0].TrainNumber}" Foreground="LightYellow" Margin="40,0,0,0"/>
<TextBlock Text="{Binding LeftScreen[0].TrainNumber}" Foreground="LightYellow" Margin="40,0,0,0"/>
<TextBlock Text="次" Foreground="LightYellow" Margin="25,0,0,0"/>
</StackPanel>
<TextBlock Grid.Column="2" Visibility="{Binding Screen[0].Landmark,Converter={StaticResource EmptyToVisibilityConverter}}" Text="{Binding Screen[0].Landmark}" Foreground="Red" FontWeight="Bold"/>
<TextBlock Grid.Column="3" Visibility="{Binding Screen[0].Landmark,Converter={StaticResource EmptyToVisibilityConverter}}" Text="地标" Foreground="Red" FontWeight="Bold"/>
<TextBlock Grid.Column="2" Visibility="{Binding LeftScreen[0].Landmark,Converter={StaticResource EmptyToVisibilityConverter}}" Text="{Binding LeftScreen[0].Landmark}" Foreground="Red" FontWeight="Bold"/>
<TextBlock Grid.Column="3" Visibility="{Binding LeftScreen[0].Landmark,Converter={StaticResource EmptyToVisibilityConverter}}" Text="地标" Foreground="Red" FontWeight="Bold"/>
</Grid>
<Grid Grid.Row="1" Margin="0,10">
<Grid.ColumnDefinitions>
@@ -57,11 +57,11 @@
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Screen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" Foreground="LawnGreen" FontSize="25"/>
<TextBlock Grid.Column="0" Text="{Binding LeftScreen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" Foreground="LawnGreen" FontSize="25"/>
<TextBlock Grid.Column="1" Text="开" Foreground="LawnGreen" FontSize="25" Margin="5,0,0,0"/>
<TextBlock Grid.Column="3" Text="{Binding Screen[0].Origin}" Foreground="LawnGreen" FontSize="25"/>
<TextBlock Grid.Column="3" Text="{Binding LeftScreen[0].Origin}" Foreground="LawnGreen" FontSize="25"/>
<TextBlock Grid.Column="5" Text="开往" Foreground="LawnGreen" FontSize="25"/>
<TextBlock Grid.Column="7" Text="{Binding Screen[0].Terminal}" Foreground="LawnGreen" FontSize="25" Margin="0,0,4,0"/>
<TextBlock Grid.Column="7" Text="{Binding LeftScreen[0].Terminal}" Foreground="LawnGreen" FontSize="25" Margin="0,0,4,0"/>
</Grid>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
@@ -72,7 +72,7 @@
<pp:RunningText Speed="20" Width="265" Grid.Column="0" FontSize="25" Foreground="LightYellow">
<pp:RunningText.Text>
<MultiBinding Mode="OneWay" Converter="{StaticResource LocationToStringConverter}">
<Binding Path="Screen[0].Length" />
<Binding Path="LeftScreen[0].Length" />
<Binding Path="Location" />
</MultiBinding>
</pp:RunningText.Text>

View File

@@ -25,7 +25,7 @@
<converters:TrainStateConverter x:Key="TrainStateConverter" WaitingText="候 车" CheckInText="检 票" StopCheckInText="停 检"/>
<converters:TrainStateColorConverter x:Key="TrainStateColorConverter" WaitingColor="LightYellow"/>
</Window.Resources>
<DataGrid ItemsSource="{Binding Screen}" AutoGenerateColumns="False"
<DataGrid ItemsSource="{Binding LeftScreen}" AutoGenerateColumns="False"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False" ClipToBounds="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="28" Foreground="LightYellow"

View File

@@ -42,7 +42,7 @@
</Grid.ColumnDefinitions>
<Border Grid.Column="0" CornerRadius="4,0,0,4" Background="#830DFF">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Screen[0].TrainNumber}" Foreground="White" VerticalAlignment="Center" Margin="8,0,0,0"/>
<TextBlock Text="{Binding LeftScreen[0].TrainNumber}" Foreground="White" VerticalAlignment="Center" Margin="8,0,0,0"/>
<TextBlock Text="次" Foreground="White" VerticalAlignment="Center" Margin="20,0"/>
</StackPanel>
</Border>
@@ -50,7 +50,7 @@
<Border Grid.Column="2" CornerRadius="0,4,4,0" Background="Yellow" x:Name="Panel">
<StackPanel Orientation="Horizontal">
<Image Grid.Column="0" Source="pack://application:,,,/CRSim.ScreenSimulator;component/Assets/Tianjin/Image.png" Height="{Binding ActualHeight,ElementName=Panel}"/>
<TextBlock Grid.Column="1" Text="{Binding Screen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" Foreground="Black" VerticalAlignment="Center" Padding="12,0,64,0"/>
<TextBlock Grid.Column="1" Text="{Binding LeftScreen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" Foreground="Black" VerticalAlignment="Center" Padding="12,0,64,0"/>
</StackPanel>
</Border>
</Grid>
@@ -60,7 +60,7 @@
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" TextAlignment="Center" Text="{Binding Screen[0].Origin}" FontSize="32" Foreground="White" FontWeight="Bold"/>
<TextBlock Grid.Column="0" TextAlignment="Center" Text="{Binding LeftScreen[0].Origin}" FontSize="32" Foreground="White" FontWeight="Bold"/>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
@@ -77,13 +77,13 @@
<Polygon Grid.Column="1" Points="0,0 0,8 8.66,4" Fill="White" Margin="0"/>
</Grid>
</Grid>
<TextBlock Grid.Column="2" TextAlignment="Center" Text="{Binding Screen[0].Terminal}" FontSize="32" Foreground="White" FontWeight="Bold"/>
<TextBlock Grid.Column="2" TextAlignment="Center" Text="{Binding LeftScreen[0].Terminal}" FontSize="32" Foreground="White" FontWeight="Bold"/>
</Grid>
<Border Grid.Row="3" CornerRadius="8" Background="#830DFF">
<TextBlock TextAlignment="Center" Foreground="White" FontSize="20" Padding="2">
<TextBlock.Text>
<MultiBinding Mode="OneWay" Converter="{StaticResource LocationToStringConverter}">
<Binding Path="Screen[0].Length" />
<Binding Path="LeftScreen[0].Length" />
<Binding Path="Location" />
</MultiBinding>
</TextBlock.Text>

View File

@@ -45,7 +45,7 @@
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding Screen}" AutoGenerateColumns="False" BorderThickness="0"
<DataGrid ItemsSource="{Binding LeftScreen}" AutoGenerateColumns="False" BorderThickness="0"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False" ClipToBounds="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="34" Foreground="White"

View File

@@ -46,11 +46,11 @@
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Screen[0].TrainNumber}" Foreground="#ffffff" Margin="15,0,0,0" FontSize="18" />
<TextBlock Grid.Column="0" Text="{Binding LeftScreen[0].TrainNumber}" Foreground="#ffffff" Margin="15,0,0,0" FontSize="18" />
<TextBlock Grid.Column="1" Text="次" Foreground="#ffffff" FontSize="16" Margin="20,0,0,0"/>
<TextBlock Grid.Column="3" Text="{Binding Screen[0].ArrivalTime,Converter={StaticResource DateTimeToStringConverter}}" Foreground="#ffffff" FontSize="18"/>
<TextBlock Grid.Column="3" Text="{Binding LeftScreen[0].ArrivalTime,Converter={StaticResource DateTimeToStringConverter}}" Foreground="#ffffff" FontSize="18"/>
<TextBlock Grid.Column="4" Text="到" Foreground="#ffffff" FontSize="18" Margin="10,0"/>
<TextBlock Grid.Column="5" Text="{Binding Screen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" Foreground="#ffffff" FontSize="18"/>
<TextBlock Grid.Column="5" Text="{Binding LeftScreen[0].DepartureTime,Converter={StaticResource DateTimeToStringConverter}}" Foreground="#ffffff" FontSize="18"/>
<TextBlock Grid.Column="6" Text="开" Foreground="#ffffff" FontSize="18" Margin="10,0"/>
</Grid>
<Grid Grid.Row="1" Margin="0,10,0,10">
@@ -66,9 +66,9 @@
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="1" Text="{Binding Screen[0].Origin}" Foreground="#ffffff" FontSize="20"/>
<TextBlock Grid.Column="1" Text="{Binding LeftScreen[0].Origin}" Foreground="#ffffff" FontSize="20"/>
<TextBlock Grid.Column="3" Text=" — " Foreground="#ffffff" FontSize="20"/>
<TextBlock Grid.Column="5" Text="{Binding Screen[0].Terminal}" Foreground="#ffffff" FontSize="20"/>
<TextBlock Grid.Column="5" Text="{Binding LeftScreen[0].Terminal}" Foreground="#ffffff" FontSize="20"/>
<TextBlock Grid.Column="7" Text="{Binding ThisPlatform}" Foreground="#ffffff" FontSize="20"/>
<TextBlock Grid.Column="9" Text="台" Foreground="#ffffff" FontSize="20" Margin="0,0,10,0"/>
</Grid>
@@ -89,7 +89,7 @@
<TextBlock Grid.Column="1" TextAlignment="Center" Foreground="White" FontSize="18" Padding="2" Margin="0,5,0,5">
<TextBlock.Text>
<MultiBinding Mode="OneWay" Converter="{StaticResource LocationToStringConverter}">
<Binding Path="Screen[0].Length" />
<Binding Path="LeftScreen[0].Length" />
<Binding Path="Location" />
</MultiBinding>
</TextBlock.Text>

View File

@@ -58,7 +58,7 @@
</Window.Resources>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<DataGrid ItemsSource="{Binding Screen, Mode=OneWay}" AutoGenerateColumns="False"
<DataGrid ItemsSource="{Binding LeftScreen, Mode=OneWay}" AutoGenerateColumns="False"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="35"