feat: #121 添加北京南站主要看板

This commit is contained in:
wxl0430
2025-05-18 20:57:12 +08:00
committed by GitHub
parent 7d5135f385
commit bb15ff623e
7 changed files with 263 additions and 5 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -94,6 +94,7 @@
<ItemGroup>
<Resource Include="Assets\Ankang\ExitScreen.png" />
<Resource Include="Assets\BeijingXi\PrimaryScreen.png" />
<Resource Include="Assets\BeijingNan\PrimaryScreen.png" />
<Resource Include="Assets\Beijing\ArrivalScreen.png" />
<Resource Include="Assets\ChengduDong\cdcz.png" />
<Resource Include="Assets\ChengduDong\PillarTicketCheckScreen.png" />
@@ -131,4 +132,4 @@
<Resource Include="Assets\Zibo\TicketCheckScreen.png" />
</ItemGroup>
</Project>
</Project>

View File

@@ -11,6 +11,14 @@ namespace CRSim.ScreenSimulator.Converters
{
private ITimeService _timeService;
private Settings _settings;
public string DisplayMode { get; set; } = "Normal";
/*
Normal: 标准显示。
Alternating_Row_Colors: 候车状态隔行异色显示第4个参数控制行号
*/
public List<SolidColorBrush> WaitingColorList { get; set; } = new List<SolidColorBrush> { new(Colors.White), new(Colors.Yellow) };
public SolidColorBrush WaitingColor { get; set; } = new(Colors.White);
public SolidColorBrush CheckingTicketsColor { get; set; } = new(Colors.LightGreen);
public SolidColorBrush StopCheckingTicketsColor { get; set; } = new(Colors.Red);
@@ -49,6 +57,9 @@ namespace CRSim.ScreenSimulator.Converters
{
return StopCheckingTicketsColor;
}
if (DisplayMode == "Alternating_Row_Colors" && values.Length > 3 && values[3] is int rowNumber){
return WaitingColorList[rowNumber % WaitingColorList.Count];
}
return WaitingColor;
}
return new SolidColorBrush(Colors.Transparent);

View File

@@ -64,7 +64,7 @@
"Author": "电排骨",
"Type": "车站大屏",
"Parameters": [
"Region"
"Station"
]
},
{
@@ -135,7 +135,7 @@
"Author": "电排骨",
"Type": "车站大屏",
"Parameters": [
"Region"
"Station"
]
},
{
@@ -181,7 +181,7 @@
"Author": "wxl0430",
"Type": "车站大屏",
"Parameters": [
"Region"
"Station"
]
},
{
@@ -191,7 +191,7 @@
"Author": "wxl0430",
"Type": "车站大屏",
"Parameters": [
"Region"
"Station"
]
},
{
@@ -321,5 +321,15 @@
"Location",
"Text"
]
},
{
"UniqueId": "BeijingNan.PrimaryScreen",
"Title": "北京南站主要看板",
"Region": "北京",
"Author": "wxl0430",
"Type": "车站大屏",
"Parameters": [
"Station"
]
}
]

View File

@@ -0,0 +1,45 @@
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
using System.Collections.ObjectModel;
using System.Windows;
namespace CRSim.ScreenSimulator.ViewModels.BeijingNan
{
public class PrimaryScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> LeftScreen { get; private set; } = [];
public PrimaryScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
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

@@ -0,0 +1,165 @@
<views:BaseScreenView x:Class="CRSim.ScreenSimulator.Views.BeijingNan.PrimaryScreenView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CRSim.ScreenSimulator.Views.BeijingNan"
mc:Ignorable="d"
xmlns:views="clr-namespace:CRSim.ScreenSimulator.Views"
xmlns:converters="clr-namespace:CRSim.ScreenSimulator.Converters"
xmlns:converters1="clr-namespace:CRSim.Shared.Converters;assembly=CRSim.Shared"
Title="引导屏" SizeToContent="WidthAndHeight"
WindowStyle="None" AllowsTransparency="True" Background="Transparent"
ResizeMode="NoResize">
<views:BaseScreenView.Resources>
<converters1:ListToStringConverter x:Key="ListToStringConverter" Separator="" />
<converters1:DateTimeToStringConverter x:Key="DateTimeToStringConverter" Format="HH:mm" />
<converters:TrainStateConverter x:Key="TrainStateConverter" WaitingText="正在候车"/>
<converters:TrainStateColorConverter x:Key="TrainStateColorConverter" DisplayMode="Alternating_Row_Colors" CheckingTicketsColor="#1f5b54"/>
<converters:TextSpacingConverter x:Key="TextSpacingConverter" />
<Style TargetType="DataGridColumnHeader">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style>
<Style x:Key="CommonTextBlockStyle" TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
<Style x:Key="CommonRowStyle" TargetType="DataGridRow">
<Setter Property="Background" Value="#203874"/>
<Setter Property="Foreground" Value="#ffffff"/>
<Setter Property="BorderBrush" Value="#0c63da"/>
<Setter Property="BorderThickness" Value="0,4,0,4"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=AlternationIndex}" Value="1">
<Setter Property="Background" Value="#203874"/>
<Setter Property="Foreground" Value="#edd16f"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=AlternationIndex}" Value="0">
<Setter Property="Background" Value="#203874"/>
<Setter Property="Foreground" Value="#ffffff"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="CommonHeaderStyle" TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="#203874"/>
</Setter.Value>
</Setter>
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="#eecbbe"/>
</Setter.Value>
</Setter>
</Style>
</views:BaseScreenView.Resources>
<StackPanel Orientation="Horizontal">
<DataGrid ItemsSource="{Binding LeftScreen, Mode=OneWay}" AutoGenerateColumns="False"
CanUserResizeColumns="False" CanUserSortColumns="False" CanUserAddRows="False"
CanUserResizeRows="False" CanUserReorderColumns="False" FontFamily="DengXian"
IsReadOnly="True" GridLinesVisibility="None" RowHeight="28"
RowStyle="{StaticResource CommonRowStyle}" FontWeight="SemiBold" FontSize="20"
AlternationCount="2" HeadersVisibility="Column" IsEnabled="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding TrainNumber}" MinWidth="110">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}}">
<TextBlock Text="车次" Style="{StaticResource CommonHeaderStyle}" Padding="0,6,0,3" FontSize="27"/>
<Border Height="2" Background="#5172af" Margin="0,0,0,0"/>
<TextBlock Text="Train" Style="{StaticResource CommonHeaderStyle}" FontSize="20" Padding="0,3,0,2"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock" BasedOn="{StaticResource CommonTextBlockStyle}"/>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Terminal, Converter={StaticResource TextSpacingConverter}}" MinWidth="130">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}}">
<TextBlock Text="终到站" Style="{StaticResource CommonHeaderStyle}" Padding="0,6,0,3" FontSize="27"/>
<Border Height="2" Background="#5172af" Margin="0,0,0,0"/>
<TextBlock Text="To" Style="{StaticResource CommonHeaderStyle}" FontSize="20" Padding="0,3,0,2"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock" BasedOn="{StaticResource CommonTextBlockStyle}"/>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding DepartureTime, Converter={StaticResource DateTimeToStringConverter}}" MinWidth="110">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}}">
<TextBlock Text="开点" Style="{StaticResource CommonHeaderStyle}" Padding="0,6,0,3" FontSize="27"/>
<Border Height="2" Background="#5172af" Margin="0,0,0,0"/>
<TextBlock Text="Departs" Style="{StaticResource CommonHeaderStyle}" FontSize="20" Padding="0,3,0,2"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock" BasedOn="{StaticResource CommonTextBlockStyle}"/>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding TicketChecks, Converter={StaticResource ListToStringConverter}}" MinWidth="100">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}}">
<TextBlock Text="检票口" Style="{StaticResource CommonHeaderStyle}" Padding="0,6,0,3" FontSize="27"/>
<Border Height="2" Background="#5172af" Margin="0,0,0,0"/>
<TextBlock Text="Gate" Style="{StaticResource CommonHeaderStyle}" FontSize="20" Padding="0,3,0,2"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock" BasedOn="{StaticResource CommonTextBlockStyle}"/>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn MinWidth="160">
<DataGridTextColumn.Binding>
<MultiBinding Mode="OneWay" Converter="{StaticResource TrainStateConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</DataGridTextColumn.Binding>
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}}">
<TextBlock Text="状态" Style="{StaticResource CommonHeaderStyle}" Padding="0,6,0,3" FontSize="27"/>
<Border Height="2" Background="#5172af" Margin="0,0,0,0"/>
<TextBlock Text="Status" Style="{StaticResource CommonHeaderStyle}" FontSize="20" Padding="0,3,0,2"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock" BasedOn="{StaticResource CommonTextBlockStyle}">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource TrainStateColorConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
<Binding RelativeSource="{RelativeSource AncestorType=DataGridRow}" Path="(ItemsControl.AlternationIndex)" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</views:BaseScreenView>

View File

@@ -0,0 +1,26 @@
using CRSim.ScreenSimulator.ViewModels.BeijingNan;
using CRSim.ScreenSimulator.Converters;
using System.Windows;
using System.Collections.Generic;
using System.Windows.Media;
namespace CRSim.ScreenSimulator.Views.BeijingNan
{
public partial class PrimaryScreenView : BaseScreenView
{
public PrimaryScreenViewModel ViewModel { get; }
public PrimaryScreenView(PrimaryScreenViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = viewModel;
var trainStateColorConverter = (TrainStateColorConverter)Resources["TrainStateColorConverter"];
trainStateColorConverter.WaitingColorList = new List<SolidColorBrush>
{
new SolidColorBrush(Colors.White),
new SolidColorBrush((Color)ColorConverter.ConvertFromString("#edd16f"))
};
}
}
}