Files
petwash/PetWashControl/Views/MainWindow.xaml.cs
GukSang.Jin 0a884fa6cb 更新
2026-03-18 13:53:44 +08:00

139 lines
4.3 KiB
C#

using PetWashControl.Models;
using PetWashControl.Services;
using PetWashControl.ViewModels;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace PetWashControl.Views;
public partial class MainWindow : Window
{
private readonly MainViewModel _viewModel;
private readonly AdminAccessService _adminAccessService;
private PackageManagementWindow? _packageManagementWindow;
public MainWindow()
{
InitializeComponent();
_adminAccessService = new AdminAccessService(new ConfigurationService());
_viewModel = new MainViewModel();
_viewModel.ViewChanged += OnViewChanged;
_viewModel.OpenPackageManagementRequested += OnOpenPackageManagementRequested;
DataContext = _viewModel;
Loaded += MainWindow_Loaded;
}
private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
await _viewModel.InitializeAsync();
ConfigureSettingsButtons();
}
private void OnViewChanged(string viewName)
{
IdleView.Visibility = Visibility.Collapsed;
PaymentView.Visibility = Visibility.Collapsed;
QRCodeView.Visibility = Visibility.Collapsed;
WashingView.Visibility = Visibility.Collapsed;
SettingsView.Visibility = Visibility.Collapsed;
switch (viewName)
{
case "Idle":
IdleView.Visibility = Visibility.Visible;
break;
case "Payment":
PaymentView.Visibility = Visibility.Visible;
break;
case "QRCode":
QRCodeView.Visibility = Visibility.Visible;
break;
case "Washing":
WashingView.Visibility = Visibility.Visible;
break;
case "Settings":
SettingsView.Visibility = Visibility.Visible;
break;
}
}
private void Package_Click(object sender, MouseButtonEventArgs e)
{
if (sender is FrameworkElement element && element.DataContext is Package package)
{
_viewModel.SelectPackageCommand.Execute(package);
}
}
private void AdminHotspot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount < 2)
{
return;
}
var loginWindow = new AdminLoginWindow(_adminAccessService)
{
Owner = this
};
var dialogResult = loginWindow.ShowDialog();
if (dialogResult == true && loginWindow.IsAuthenticated)
{
_viewModel.ShowSettingsFromAdmin();
}
}
private void OnOpenPackageManagementRequested()
{
if (_packageManagementWindow?.IsVisible == true)
{
_packageManagementWindow.Activate();
return;
}
_packageManagementWindow = new PackageManagementWindow(_viewModel)
{
Owner = this
};
_packageManagementWindow.Closed += (_, _) => _packageManagementWindow = null;
_packageManagementWindow.ShowDialog();
}
private void ConfigureSettingsButtons()
{
foreach (var button in FindVisualChildren<Button>(SettingsView))
{
if (ReferenceEquals(button.Command, _viewModel.OpenPackageManagementCommand))
{
button.Content = "套餐管理";
button.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1976D2"));
}
else if (ReferenceEquals(button.Command, _viewModel.SaveSettingsCommand))
{
button.Content = "保存设置";
button.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4CAF50"));
}
}
}
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject root) where T : DependencyObject
{
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
{
var child = VisualTreeHelper.GetChild(root, i);
if (child is T typedChild)
{
yield return typedChild;
}
foreach (var nestedChild in FindVisualChildren<T>(child))
{
yield return nestedChild;
}
}
}
}