feat: 新增福州站检票口看板

This commit is contained in:
denglihong2007
2025-03-10 01:24:14 +08:00
parent 6596cd8777
commit 5d40483e40
23 changed files with 352 additions and 7 deletions

View File

@@ -37,7 +37,7 @@
services.AddTransient<ViewModels.ChengduDong.SecondaryScreenViewModel>();
services.AddTransient<Views.ChengduDong.SecondaryScreenView>();
services.AddTransient<ViewModels.ChengduDong.PlatformScreenViewModel>();
services.AddTransient<ViewModels.ChengduDong.PrimaryTicketCheckScreenViewModel>();
services.AddTransient<Views.ChengduDong.PrimaryTicketCheckScreenView>();
services.AddTransient<ViewModels.BeijingXi.PrimaryScreenViewModel>();
services.AddTransient<Views.BeijingXi.PrimaryScreenView>();
@@ -61,6 +61,8 @@
services.AddTransient<Views.GuangdongIntercity.SecondaryScreenView>();
services.AddTransient<ViewModels.Tianjin.PlatformScreenViewModel>();
services.AddTransient<Views.Tianjin.PlatformScreenView>();
services.AddTransient<ViewModels.Fuzhou.TicketCheckScreenViewModel>();
services.AddTransient<Views.Fuzhou.TicketCheckScreenView>();
}).Build();
[STAThread]

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -14,6 +14,7 @@
<ItemGroup>
<ApplicationDefinition Remove="App.xaml" />
<None Remove="Assets\StyleImages\Fuzhou\TicketCheckScreen.png" />
<None Remove="Assets\StyleImages\Tianjin\image.png" />
<None Remove="Assets\StyleImages\Tianjin\PlatformScreen.png" />
<Content Include="Assets\Advertisement.mp4">
@@ -37,6 +38,7 @@
<Resource Include="Assets\StyleImages\ChengduDong\SecondaryScreen.png" />
<Resource Include="Assets\StyleImages\ChengduMetro\ChengduMetro-Icon.png" />
<Resource Include="Assets\StyleImages\ChengduMetro\PlatformScreen.png" />
<Resource Include="Assets\StyleImages\Fuzhou\TicketCheckScreen.png" />
<Resource Include="Assets\StyleImages\GuangdongIntercity\SecondaryScreen.png" />
<Resource Include="Assets\StyleImages\Guangyuan\PrimaryScreen.png" />
<Resource Include="Assets\StyleImages\Hanzhong\Image.png" />

View File

@@ -22,6 +22,18 @@
"Text"
]
},
{
"UniqueId": "Fuzhou TicketCheckScreen",
"Title": "福州站检票口看板",
"Station": "Fuzhou",
"StyleName": "TicketCheckScreenView",
"ImagePath": "Assets/StyleImages/Fuzhou/TicketCheckScreen.png",
"Parameters": [
"Station",
"TicketCheck",
"Text"
]
},
{
"UniqueId": "BeijingXi PrimaryScreen",
"Title": "北京西站主要看板",

View File

@@ -19,6 +19,8 @@ namespace CRSim.ViewModels
private Station _thisStation;
[ObservableProperty]
private string _thisPlatform;
[ObservableProperty]
private string _thisTicketCheck;
public event PropertyChangedEventHandler PropertyChanged;
public List<TrainInfo> TrainInfo { get; set; } = [];
@@ -60,6 +62,7 @@ namespace CRSim.ViewModels
{
ThisStation = station;
ThisPlatform = platform;
ThisTicketCheck = ticketCheck;
var trains = station.StationStops;
foreach (var trainNumber in trains)
{

View File

@@ -1,9 +1,9 @@
namespace CRSim.ViewModels.ChengduDong
{
public class PlatformScreenViewModel : ScreenViewModel
public class PrimaryTicketCheckScreenViewModel : ScreenViewModel
{
public ObservableCollection<TrainInfo> Screen { get; set; } = [];
public PlatformScreenViewModel(ITimeService timeService, ISettingsService settingsService)
public PrimaryTicketCheckScreenViewModel(ITimeService timeService, ISettingsService settingsService)
: base(timeService, settingsService)
{
Text = "持户口簿、护照、临时身份证的旅客,请在非居民身份证通道排队。请主动礼让老、弱、病、残、孕的旅客。";

View File

@@ -0,0 +1,31 @@
namespace CRSim.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}分钟停止检票";
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());
}
});
}
}
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.BeijingXi
public PrimaryScreenView(PrimaryScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -7,10 +7,11 @@ namespace CRSim.Views.ChengduDong
/// </summary>
public partial class PrimaryTicketCheckScreenView : Window
{
public PlatformScreenViewModel ViewModel { get; }
public PrimaryTicketCheckScreenView(PlatformScreenViewModel viewModel)
public PrimaryTicketCheckScreenViewModel ViewModel { get; }
public PrimaryTicketCheckScreenView(PrimaryTicketCheckScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.ChengduDong
public SecondaryScreenView(SecondaryScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -14,6 +14,7 @@ namespace CRSim.Views.ChengduMetro
{
InitializeComponent();
ViewModel = viewModel;
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
DataContext = this;
player.Source = new Uri("Assets\\Advertisement.mp4", UriKind.Relative);
player.Play();

View File

@@ -0,0 +1,248 @@
<Window x:Class="CRSim.Views.Fuzhou.TicketCheckScreenView"
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.Views.Fuzhou"
mc:Ignorable="d"
xmlns:converters="clr-namespace:CRSim.Converters"
FontFamily="黑体" FontSize="20" FontWeight="Bold"
Title="引导屏" SizeToContent="WidthAndHeight"
WindowStyle="None" AllowsTransparency="True" Background="Black"
KeyDown="Window_KeyDown"
ResizeMode="NoResize" MouseDown="Window_MouseDown">
<Window.Resources>
<Style TargetType="DataGridColumnHeader">
<!-- 去除列头的间距 -->
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="SeparatorBrush" Value="Black"/>
<Setter Property="SeparatorVisibility" Value="Collapsed"/>
</Style>
<converters:TrainStateConverter x:Key="TrainStateConverter" WaitingText="候车"/>
<converters:TrainStateColorConverter x:Key="TrainStateColorConverter" WaitingColor="#FFF150"/>
<converters:LandmarkToStringConverter x:Key="LandmarkToStringConverter"/>
<converters:NumberToStringConverter x:Key="NumberToStringConverter"/>
<converters:DateTimeToStringConverter x:Key="DateTimeToStringTimeConverter" Format="yyyy-MM-dd HH:mm:ss" />
<converters:DateTimeToStringConverter x:Key="DateTimeToStringConverter" Format="HH:mm" />
</Window.Resources>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical" Background="#545863">
<Grid MinWidth="100" Margin="30,4">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding ThisTicketCheck}" Foreground="#FFF150"
FontWeight="Bold" FontSize="88" TextAlignment="Center"/>
<TextBlock Grid.Row="1" Text="检票口" Foreground="#FFF150" TextAlignment="Center" FontSize="32"/>
<TextBlock Grid.Row="2" Text="Ticket Check" Foreground="#FFF150" FontSize="16"
TextAlignment="Center" FontFamily="Arial"/>
</Grid>
</StackPanel>
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding Screen}" 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"
HeadersVisibility="Column" IsEnabled="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding TrainNumber}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="车次" Padding="2" HorizontalAlignment="Stretch" TextAlignment="Center" Foreground="Red" Background="Black" Width="145"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource TrainStateColorConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Terminal}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="终到站" Padding="2" HorizontalAlignment="Stretch" TextAlignment="Center" Foreground="Red" Background="Black" Width="145"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource TrainStateColorConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding DepartureTime, Converter={StaticResource DateTimeToStringConverter}}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="开点" Padding="2" HorizontalAlignment="Stretch" TextAlignment="Center" Foreground="Red" Background="Black" Width="145"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource TrainStateColorConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Platform}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="站台" Padding="2" HorizontalAlignment="Stretch" TextAlignment="Center" Foreground="Red" Background="Black" Width="145"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource TrainStateColorConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Landmark,Converter={StaticResource LandmarkToStringConverter}}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="地标" Padding="2" HorizontalAlignment="Stretch" TextAlignment="Center" Foreground="Red" Background="Black" Width="145"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource TrainStateColorConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Length,Converter={StaticResource NumberToStringConverter}}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="车厢" Padding="2" HorizontalAlignment="Stretch" TextAlignment="Center" Foreground="Red" Background="Black" Width="145"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource TrainStateColorConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn>
<DataGridTextColumn.Binding>
<MultiBinding Mode="OneWay" Converter="{StaticResource TrainStateConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</DataGridTextColumn.Binding>
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="状态" Padding="2" HorizontalAlignment="Stretch" TextAlignment="Center" Foreground="Red" Background="Black" Width="145"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource TrainStateColorConverter}">
<Binding Path="ArrivalTime" />
<Binding Path="DepartureTime" />
<Binding Path="State" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="Black"/>
</Style>
</DataGrid.RowStyle>
</DataGrid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Background="Black" Foreground="Red" TextAlignment="Center" Padding="2,2,2,2" Text="{Binding Text}"/>
<TextBlock Grid.Column="2" Background="Black" Foreground="Red" TextAlignment="Center" Padding="2" Text="{Binding CurrentTime,Converter={StaticResource DateTimeToStringTimeConverter}}"/>
</Grid>
</StackPanel>
<StackPanel Orientation="Vertical" Background="#545863">
<Grid MinWidth="100" Margin="30,4">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding ThisTicketCheck}" Foreground="#FFF150"
FontWeight="Bold" FontSize="88" TextAlignment="Center"/>
<TextBlock Grid.Row="1" Text="检票口" Foreground="#FFF150" TextAlignment="Center" FontSize="32"/>
<TextBlock Grid.Row="2" Text="Ticket Check" Foreground="#FFF150" FontSize="16"
TextAlignment="Center" FontFamily="Arial"/>
</Grid>
</StackPanel>
</StackPanel>
</Window>

View File

@@ -0,0 +1,34 @@
using CRSim.ViewModels.Fuzhou;
namespace CRSim.Views.Fuzhou
{
/// <summary>
/// SecondaryScreen.xaml 的交互逻辑
/// </summary>
public partial class TicketCheckScreenView : Window
{
public TicketCheckScreenViewModel ViewModel { get; }
public TicketCheckScreenView(TicketCheckScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}
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();
}
}
}
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.GuangdongIntercity
public SecondaryScreenView(SecondaryScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.Guangyuan
public PrimaryScreenView(OutsideScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.Hanzhong
public PlatformScreenView(PlatformScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.Harbin
public PrimaryScreenView(PrimaryScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.Jinanxi
public SmallScreenView(SmallScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.Shanghai
public OutsideScreenView(OutsideScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -16,13 +16,13 @@
<converters:LocationToStringConverter x:Key="LocationToStringConverter" />
</Window.Resources>
<StackPanel Orientation="Horizontal">
<Grid Width="100">
<Grid MinWidth="100">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding Text}" Foreground="Yellow" FontWeight="Bold" FontSize="64" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Text="{Binding ThisPlatform}" Foreground="Yellow" FontWeight="Bold" FontSize="64" TextAlignment="Center"/>
<TextBlock Grid.Row="1" Text="站台" Foreground="Yellow" TextAlignment="Center" FontSize="32"/>
<TextBlock Grid.Row="2" Text="platform" Foreground="Yellow" FontSize="12" TextAlignment="Center" Margin="0,0,0,8"/>
</Grid>

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.Tianjin
public PlatformScreenView(PlatformScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.Zibo
public PrimaryScreenView(PrimaryScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}

View File

@@ -11,6 +11,7 @@ namespace CRSim.Views.Zibo
public SecondaryScreenView(SecondaryScreenViewModel viewModel)
{
InitializeComponent();
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
ViewModel = viewModel;
DataContext = viewModel;
}