feat: 添加徐州地铁站台看板

This commit is contained in:
denglihong2007
2025-04-13 12:18:29 +08:00
parent 81dfbed3ff
commit 8c4a35db29
15 changed files with 278 additions and 9 deletions

View File

@@ -31,6 +31,9 @@
<Compile Update="Views\Windows\Stations\ChengduDong\SecondaryScreenView.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="Views\Windows\Stations\XuzhouMetro\PlatformScreenView.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="Views\Windows\Stations\ChengduMetro\PlatformScreenView.xaml.cs">
<SubType>Code</SubType>
</Compile>

View File

@@ -10,6 +10,9 @@ namespace CRSim.ScreenSimulator.Converters
public class MetroDateTimeToStringConverter : IValueConverter
{
private ITimeService _timeService;
public string WaitingText { get; set; } = "请耐心等待";
public string ComingText { get; set; } = "即将进站";
public string ArrivedText { get; set; } = "列车进站";
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
var serviceProvider = (IServiceProvider)Application.Current.Resources["ServiceProvider"];
@@ -18,7 +21,7 @@ namespace CRSim.ScreenSimulator.Converters
{
if(trainInfo.TrainNumber == null)
{
return "请耐心等待";
return WaitingText;
}
var timeDifference = (trainInfo.ArrivalTime ?? DateTime.MinValue) - _timeService.GetDateTimeNow();
bool isArrivalTimeNull = trainInfo.ArrivalTime == null;
@@ -31,10 +34,10 @@ namespace CRSim.ScreenSimulator.Converters
{
if(trainInfo.ArrivalTime - _timeService.GetDateTimeNow() > TimeSpan.Zero)
{
return "即将进站";
return ComingText;
}
}
return "列车进站";
return ArrivedText;
}
}
else

View File

@@ -16,7 +16,7 @@ namespace CRSim.ScreenSimulator.ViewModels.ChengduMetro
[ObservableProperty]
private string _text = "不吃火锅,就吃烤匠。 建设成渝地区双城经济圈,共同唱好新时代西部“双城记”。 2018年2月8日复兴号列车首次担当G89次列车正式开进四川标志着“复兴号”高速列车正式走上蜀道。然而在行驶至西安北站时发生了突发设备故障车轴出现过热报警导致车号为CR400BF-5033的复兴号列车被迫停运并进行检修。相关工作人员迅速展开故障排查并确保乘客安全无虞。";
[ObservableProperty]
private Uri _video = new("Assets\\Advertisement.mp4", UriKind.Relative);
private Uri _video = new("Assets\\Advertisement-1.mp4", UriKind.Relative);
public List<TrainInfo> TrainInfos { get; set; } = [];
public PlatformScreenViewModel(ITimeService timeService)
@@ -24,12 +24,12 @@ namespace CRSim.ScreenSimulator.ViewModels.ChengduMetro
_timeService = timeService;
timeService.OneSecondElapsed += RefreshDisplay;
}
public void LoadData(Station station,string _ticketCheck,string _platform)
public void LoadData(Station station,string _ticketCheck,string platform)
{
var trains = station.TrainStops;
foreach (var trainNumber in trains)
{
if (trainNumber != null && trainNumber.DepartureTime != null)
if (trainNumber != null && trainNumber.DepartureTime != null && trainNumber.Platform==platform)
{
var now = _timeService.GetDateTimeNow();
var today = now.Date;

View File

@@ -0,0 +1,68 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CRSim.Core.Models;
using CRSim.Core.Services;
using CRSim.ScreenSimulator.Models;
namespace CRSim.ScreenSimulator.ViewModels.XuzhouMetro
{
public partial class PlatformScreenViewModel : ObservableObject
{
private readonly ITimeService _timeService;
[ObservableProperty]
private DateTime _currentTime = new();
[ObservableProperty]
private TrainInfo _firstTrain = new();
[ObservableProperty]
private TrainInfo _secondTrain = new();
[ObservableProperty]
private string _text = "徐州,一座镌刻华夏文明印记的英雄之城。这里是大汉王朝的摇篮,楚风汉韵流淌在云龙山水间,龟山汉墓诉说着千年的传奇,汉画像石馆定格了古人的智慧光影。九里山前古战场,戏马台边秋风烈,历史的豪情从未褪色。作为五省通衢的枢纽,徐州以开放的胸怀连接南北,高铁飞驰、运河如练,现代脉动与古朴底蕴在此交融。登云龙山俯瞰一城青山半城湖,泛舟云龙湖感受水墨诗意;户部山的街巷藏着老徐州的烟火气,回龙窝的灯火点亮了夜色温柔。从地锅鸡的鲜香到饣它汤的醇厚,从酥脆的烙馍到清甜的蜜三刀,舌尖上的彭城满是热情滋味。这里是淮海之芯,用智造之光照亮未来,用楚汉气魄续写新章——徐州,等你共赴一场跨越时空的约定!";
[ObservableProperty]
private Uri _video = new("Assets\\Advertisement-2.mp4", UriKind.Relative);
public List<TrainInfo> TrainInfos { get; set; } = [];
public PlatformScreenViewModel(ITimeService timeService)
{
_timeService = timeService;
timeService.OneSecondElapsed += RefreshDisplay;
}
public void LoadData(Station station,string _ticketCheck,string platform)
{
var trains = station.TrainStops;
foreach (var trainNumber in trains)
{
if (trainNumber != null && trainNumber.DepartureTime != null && trainNumber.Platform==platform)
{
var now = _timeService.GetDateTimeNow();
var today = now.Date;
DateTime? AdjustTime(TimeSpan? time) =>
time.HasValue ? (today.Add(time.Value) > now ? today.Add(time.Value) : today.Add(time.Value).AddDays(1)) : null;
TrainInfos.Add(new TrainInfo
{
TrainNumber = trainNumber.Number,
Terminal = trainNumber.Terminal,
ArrivalTime = AdjustTime(trainNumber.ArrivalTime),
DepartureTime = AdjustTime(trainNumber.DepartureTime),
State = TimeSpan.Zero
});
}
}
TrainInfos = [.. TrainInfos.OrderBy(x => x.ArrivalTime ?? x.DepartureTime)];
}
private void RefreshDisplay(object? sender, EventArgs e)
{
CurrentTime = _timeService.GetDateTimeNow();
List<TrainInfo> itemsToRemove = [.. TrainInfos.Where(info => info.DepartureTime < _timeService.GetDateTimeNow())];
foreach (var item in itemsToRemove)
{
TrainInfos.Remove(item);
}
FirstTrain = TrainInfos.Count > 0 ? TrainInfos[0] : new();
SecondTrain = TrainInfos.Count > 1 ? TrainInfos[1] : new();
OnPropertyChanged(nameof(FirstTrain));
OnPropertyChanged(nameof(SecondTrain));
}
}
}

View File

@@ -0,0 +1,123 @@
<Window x:Class="CRSim.ScreenSimulator.Views.XuzhouMetro.PlatformScreenView"
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.XuzhouMetro"
xmlns:pp="https://www.cnblogs.com/pumbaa"
mc:Ignorable="d"
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"
KeyDown="Window_KeyDown" FontFamily="DengXian" FontWeight="SemiBold"
ResizeMode="NoResize" MouseDown="Window_MouseDown">
<Window.Resources>
<converters1:DateTimeToStringConverter x:Key="DateTimeToWeekdayConverter" Format="dddd" />
<converters1:DateTimeToStringConverter x:Key="DateTimeToDateConverter" Format="yyyy年M月d日" />
<converters1:DateTimeToStringConverter x:Key="DateTimeToWeekdayEnglishConverter" Format="ddd" Culture="en-US"/>
<converters1:DateTimeToStringConverter x:Key="DateTimeToTimeConverter" Format="HH:mm" />
<converters:MetroDateTimeToVisibilityConverter x:Key="MetroDateTimeToVisibilityConverter"/>
<converters:MetroDateTimeToStringConverter x:Key="MetroDateTimeToStringConverter" ComingText="即将到达" ArrivedText="已经到达"/>
</Window.Resources>
<Grid>
<Grid.Background>
<ImageBrush ImageSource="pack://application:,,,/Assets/StyleImages/XuzhouMetro/Background.jpg" Stretch="UniformToFill"/>
</Grid.Background>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Image Grid.Row="0" Grid.Column="0" Source="pack://application:,,,/Assets/StyleImages/XuzhouMetro/XuzhouMetro-Icon.png" Width="140" Margin="0,6"/>
<Grid Grid.Row="0" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding ViewModel.CurrentTime,Converter={StaticResource DateTimeToDateConverter}}" FontSize="28" VerticalAlignment="Center" Foreground="White"/>
<TextBlock Grid.Column="2" Text="{Binding ViewModel.CurrentTime,Converter={StaticResource DateTimeToWeekdayConverter}}" FontSize="28" VerticalAlignment="Center" Foreground="White"/>
<TextBlock Grid.Column="4" Text="{Binding ViewModel.CurrentTime,Converter={StaticResource DateTimeToTimeConverter}}" FontSize="28" VerticalAlignment="Center" Foreground="White" Margin="0,0,30,0"/>
</Grid>
<Grid Grid.Row="1" Grid.Column="0" Width="200" Height="200" HorizontalAlignment="Left" Background="#3F000000" Margin="4">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="1.5*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="12,12">
<TextBlock Text="本次列车终点站" FontSize="17" Foreground="Yellow" VerticalAlignment="Center"/>
<Image Height="17" Source="pack://application:,,,/Assets/StyleImages/XuzhouMetro/Metro.png" Margin="4,0,0,0"/>
</StackPanel>
<TextBlock Grid.Row="1" Text="{Binding ViewModel.FirstTrain.Terminal}" FontSize="25" Foreground="White" TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Row="2" Text="到站时间" FontSize="17" Foreground="Yellow" VerticalAlignment="Center" Margin="12,0,0,0"/>
<TextBlock Grid.Row="3" Text="{Binding ViewModel.FirstTrain,Converter={StaticResource MetroDateTimeToStringConverter},ConverterParameter=TextBlock}"
FontSize="25" Foreground="White" TextWrapping="Wrap" TextAlignment="Center" Margin="0,0,0,12" FontWeight="Bold" VerticalAlignment="Center"
Visibility="{Binding ViewModel.FirstTrain,Converter={StaticResource MetroDateTimeToVisibilityConverter},ConverterParameter=TextBlock}"/>
<StackPanel Grid.Row="3" Orientation="Horizontal" Margin="0,0,0,10" HorizontalAlignment="Center" VerticalAlignment="Center"
Visibility="{Binding ViewModel.FirstTrain,Converter={StaticResource MetroDateTimeToVisibilityConverter},ConverterParameter=StackPanel}">
<TextBlock Text="{Binding ViewModel.FirstTrain,Converter={StaticResource MetroDateTimeToStringConverter},ConverterParameter=StackPanel}"
VerticalAlignment="Bottom" FontSize="60" Foreground="White"/>
<TextBlock Text="分钟" FontSize="24" Foreground="White" VerticalAlignment="Bottom" Margin="8,0,0,6"/>
</StackPanel>
</Grid>
<Grid Grid.Row="2" Grid.Column="0" Width="200" Height="176" HorizontalAlignment="Left" Background="#3F000000" Margin="4">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="1.5*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="12,10">
<TextBlock Text="下次列车终点站" FontSize="17" Foreground="Yellow" VerticalAlignment="Center"/>
<Image Height="17" Source="pack://application:,,,/Assets/StyleImages/XuzhouMetro/Metro.png" Margin="4,0,0,0"/>
</StackPanel>
<TextBlock Grid.Row="1" Text="{Binding ViewModel.SecondTrain.Terminal}" FontSize="21" Foreground="White" TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Row="2" Text="到站时间" FontSize="17" Foreground="Yellow" VerticalAlignment="Center" Margin="12,0,0,0"/>
<TextBlock Grid.Row="3" Text="{Binding ViewModel.SecondTrain,Converter={StaticResource MetroDateTimeToStringConverter},ConverterParameter=TextBlock}"
FontSize="25" Foreground="White" TextWrapping="Wrap" TextAlignment="Center" Margin="0,0,0,12" FontWeight="Bold" VerticalAlignment="Center"
Visibility="{Binding ViewModel.SecondTrain,Converter={StaticResource MetroDateTimeToVisibilityConverter},ConverterParameter=TextBlock}"/>
<StackPanel Grid.Row="3" Orientation="Horizontal" Margin="0,0,0,8" HorizontalAlignment="Center" VerticalAlignment="Center"
Visibility="{Binding ViewModel.SecondTrain,Converter={StaticResource MetroDateTimeToVisibilityConverter},ConverterParameter=StackPanel}">
<TextBlock Text="{Binding ViewModel.SecondTrain,Converter={StaticResource MetroDateTimeToStringConverter},ConverterParameter=StackPanel}"
VerticalAlignment="Bottom" FontSize="36" Foreground="White"/>
<TextBlock Text="分钟" FontSize="21" Foreground="White" VerticalAlignment="Bottom" Margin="8,0,0,4"/>
</StackPanel>
</Grid>
<Grid Grid.Row="1" Grid.Column="1" Grid.RowSpan="2" Grid.ColumnSpan="2" Width="580">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<MediaElement Grid.Row="0" Name="player" HorizontalAlignment="Center" VerticalAlignment="Stretch"
LoadedBehavior="Manual" UnloadedBehavior="Stop" Volume="0" MediaEnded="MediaElement_MediaEnded" Source="{Binding ViewModel.Video}"/>
<pp:RunningText Grid.Row="1" x:Name="rt" Background="#3385E8" Foreground="White" Padding="12" FontSize="28" Speed="75" Margin="0,0,0,4"
Text="{Binding ViewModel.Text,Mode=OneWay}">
<pp:RunningText.Style>
<Style TargetType="{x:Type pp:RunningText}">
<Setter Property="VerticalAlignment" Value="Top" />
<Style.Triggers>
<Trigger Property="Direction" Value="BottomToTop">
<Setter Property="VerticalAlignment" Value="Stretch" />
<Setter Property="HorizontalAlignment" Value="Left" />
</Trigger>
<Trigger Property="Direction" Value="TopToBottom">
<Setter Property="VerticalAlignment" Value="Stretch" />
<Setter Property="HorizontalAlignment" Value="Left" />
</Trigger>
</Style.Triggers>
</Style>
</pp:RunningText.Style>
</pp:RunningText>
</Grid>
</Grid>
</Window>

View File

@@ -0,0 +1,45 @@
using CRSim.ScreenSimulator.ViewModels.XuzhouMetro;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
namespace CRSim.ScreenSimulator.Views.XuzhouMetro
{
/// <summary>
/// SecondaryScreen.xaml 的交互逻辑
/// </summary>
public partial class PlatformScreenView : Window
{
public PlatformScreenViewModel ViewModel { get; }
public PlatformScreenView(PlatformScreenViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
DataContext = this;
player.Play();
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
DragMove();
}
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
Close();
}
}
private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
player.Position = TimeSpan.Zero;
player.Play();
}
}
}

View File

@@ -51,6 +51,8 @@
services.AddTransient<ScreenSimulator.Views.Guangyuan.PrimaryScreenView>();
services.AddTransient<ScreenSimulator.ViewModels.ChengduMetro.PlatformScreenViewModel>();
services.AddTransient<ScreenSimulator.Views.ChengduMetro.PlatformScreenView>();
services.AddTransient<ScreenSimulator.ViewModels.XuzhouMetro.PlatformScreenViewModel>();
services.AddTransient<ScreenSimulator.Views.XuzhouMetro.PlatformScreenView>();
services.AddTransient<ScreenSimulator.ViewModels.Shanghai.OutsideScreenViewModel>();
services.AddTransient<ScreenSimulator.Views.Shanghai.OutsideScreenView>();
services.AddTransient<ScreenSimulator.ViewModels.Hanzhong.PlatformScreenViewModel>();

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

View File

@@ -9,11 +9,12 @@
<LangVersion>13.0</LangVersion>
<StartupObject>CRSim.App</StartupObject>
<ApplicationIcon>Assets\CRSimIcon.ico</ApplicationIcon>
<Version>2.1.3.0</Version>
<Version>2.2.0.0</Version>
</PropertyGroup>
<ItemGroup>
<ApplicationDefinition Remove="App.xaml" />
<None Remove="Assets\Advertisement-2.mp4" />
<None Remove="Assets\HomeHeaderTiles\Header-docs.png" />
<None Remove="Assets\HomeHeaderTiles\Header-docs.svg" />
<None Remove="Assets\StyleImages\Ankang\ExitScreen.png" />
@@ -22,7 +23,13 @@
<None Remove="Assets\StyleImages\Mianyang\PlatformScreen.png" />
<None Remove="Assets\StyleImages\Tianjin\image.png" />
<None Remove="Assets\StyleImages\Tianjin\PlatformScreen.png" />
<Content Include="Assets\Advertisement.mp4">
<None Remove="Assets\StyleImages\XuzhouMetro\Background.jpg" />
<None Remove="Assets\StyleImages\XuzhouMetro\Metro.png" />
<None Remove="Assets\StyleImages\XuzhouMetro\XuzhouMetro-Icon.png" />
<Content Include="Assets\Advertisement-1.mp4">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Assets\Advertisement-2.mp4">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Assets\CRSimIcon.ico" />
@@ -42,6 +49,9 @@
<Resource Include="Assets\StyleImages\BeijingXi\PrimaryScreen.png" />
<Resource Include="Assets\StyleImages\ChengduDong\PrimaryTicketCheckScreen.png" />
<Resource Include="Assets\StyleImages\ChengduDong\SecondaryScreen.png" />
<Resource Include="Assets\StyleImages\XuzhouMetro\Background.jpg" />
<Resource Include="Assets\StyleImages\XuzhouMetro\Metro.png" />
<Resource Include="Assets\StyleImages\XuzhouMetro\PlatformScreen.png" />
<Resource Include="Assets\StyleImages\ChengduMetro\ChengduMetro-Icon.png" />
<Resource Include="Assets\StyleImages\ChengduMetro\PlatformScreen.png" />
<Resource Include="Assets\StyleImages\FuzhouNan\TicketCheckScreen.png" />
@@ -56,6 +66,7 @@
<Resource Include="Assets\StyleImages\Shanghai\OutsideScreen.png" />
<Resource Include="Assets\StyleImages\Tianjin\image.png" />
<Resource Include="Assets\StyleImages\Tianjin\PlatformScreen.png" />
<Resource Include="Assets\StyleImages\XuzhouMetro\XuzhouMetro-Icon.png" />
<Resource Include="Assets\StyleImages\Zibo\PrimaryScreen.png" />
<Resource Include="Assets\StyleImages\Zibo\SecondaryScreen.png" />
<Resource Include="Assets\StyleImages\Zibo\TicketCheckScreen.png" />

View File

@@ -76,7 +76,21 @@
"Parameters": [
"Station",
"Text",
"Video"
"Video",
"Platform"
]
},
{
"UniqueId": "XuzhouMetro PlatformScreen",
"Title": "徐州地铁站台看板",
"Station": "XuzhouMetro",
"StyleName": "PlatformScreenView",
"ImagePath": "Assets/StyleImages/XuzhouMetro/PlatformScreen.png",
"Parameters": [
"Station",
"Text",
"Video",
"Platform"
]
},
{