This repository has been archived on 2025-06-24. You can view files and clone it, but cannot push or open issues or pull requests.
KTVApp/MainWindow.xaml.cs

348 lines
12 KiB
C#
Raw Normal View History

2025-03-18 11:16:57 +08:00
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
using System.Globalization;
using Path = System.IO.Path; // 明確指定使用 System.IO.Path
namespace KTVApp
{
public class StringNullOrEmptyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return !string.IsNullOrEmpty(value as string);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection<Room> _rooms;
private TcpServer _tcpServer;
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
public MainWindow()
{
AllocConsole(); // 分配一个控制台窗口
Rooms = new ObservableCollection<Room>();
LoadRoomsFromFile("room.txt");
LoadRoomStatesFromFile("roomstates.txt"); // 加载房间的状态
DataContext = this;
// 启动 TCP 服务器
_tcpServer = new TcpServer(1000);
_tcpServer.MessageReceived += OnMessageReceived; // 订阅事件
_tcpServer.Start();
}
public ObservableCollection<Room> Rooms
{
get => _rooms;
set
{
_rooms = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
2025-03-27 17:38:57 +08:00
/// <summary>
/// 當使用者點擊 Rectangle 物件時會觸發此事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
2025-03-18 11:16:57 +08:00
private void Rectangle_MouseDown(object sender, MouseButtonEventArgs e)
{
2025-03-27 17:38:57 +08:00
// 將 sender 轉換為 Rectangle 類型
2025-03-18 11:16:57 +08:00
var rect = sender as Rectangle;
2025-03-27 17:38:57 +08:00
// 透過 DataContext 獲取關聯的 Room 物件
2025-03-18 11:16:57 +08:00
var room = rect.DataContext as Room;
2025-03-27 17:38:57 +08:00
// 根據傳入的房間資料創建新的 RoomDetailsWindow 實例
// 並且傳遞房間資訊 (room) 以及 TCP 服務器 (_tcpServer) 給該視窗
2025-03-18 11:16:57 +08:00
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
2025-03-27 17:38:57 +08:00
// 顯示新創建的 RoomDetailsWindow
2025-03-18 11:16:57 +08:00
roomDetailsWindow.Show();
}
private void LoadRoomsFromFile(string filePath)
{
if (!File.Exists(filePath))
{
MessageBox.Show($"File not found: {filePath}");
return;
}
try
{
var lines = File.ReadAllLines(filePath);
foreach (var line in lines)
{
var parts = line.Split(';');
if (parts.Length == 2)
{
var floor = parts[0];
var roomNumbers = parts[1].Split(',');
foreach (var roomNumber in roomNumbers)
{
// 获取roomNumber的末三码
var lastThreeDigits = roomNumber.Length > 3 ? roomNumber.Substring(roomNumber.Length - 3) : roomNumber;
var newRoomNumber = "0" + lastThreeDigits;
Rooms.Add(new Room
{
RoomNumber = newRoomNumber,
RoomPC = roomNumber,
Status = "可用", // 默认状态,可以根据需要修改
TimeRange = "Not Set", // 默认时间范围,可以根据需要修改
ServiceStatus = "NonService" // 默认服务状态
});
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Error reading file: {ex.Message}");
}
}
private void LoadRoomStatesFromFile(string filePath)
{
if (!File.Exists(filePath))
{
MessageBox.Show($"File not found: {filePath}");
return;
}
try
{
var lines = File.ReadAllLines(filePath);
foreach (var line in lines)
{
var parts = line.Split(';');
if (parts.Length == 5)
{
var roomPC = parts[0];
var roomNumber = parts[1];
var status = parts[2];
var timeRange = parts[3];
var serviceStatus = parts[4];
var room = Rooms.FirstOrDefault(r => r.RoomPC == roomPC);
if (room != null)
{
room.RoomNumber = roomNumber;
room.Status = status;
room.TimeRange = timeRange;
room.ServiceStatus = serviceStatus;
}
else
{
// Room does not exist, so add a new one
Rooms.Add(new Room
{
RoomPC = roomPC,
RoomNumber = roomNumber,
Status = status,
TimeRange = timeRange,
ServiceStatus = serviceStatus
});
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Error reading file: {ex.Message}");
}
}
private void OnMessageReceived(string message)
{
Console.WriteLine($"收到消息: {message}");
var parts = message.Split(',');
if (parts.Length >= 2)
{
var roomNumber = parts[0].PadLeft(4, '0');
var command = parts[1];
Application.Current.Dispatcher.Invoke(() =>
{
try
{
var room = Rooms.FirstOrDefault(r => r.RoomNumber == roomNumber);
if (room != null)
{
if (command == "O" && parts.Length >= 4)
{
room.Status = "已占用";
room.TimeRange = parts[3];
Console.WriteLine($"房間 {roomNumber} 開機,時間: {parts[3]}");
SaveRoomsToFile("roomstates.txt");
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
roomDetailsWindow.Start_Click(null, null);
}
else if (command == "O")
{
room.Status = "已占用";
room.TimeRange = "Not Set";
Console.WriteLine($"房間 {roomNumber} 開機");
SaveRoomsToFile("roomstates.txt");
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
roomDetailsWindow.Start_Click(null, null);
}
else if (command == "P")
{
room.Status = "可用";
room.TimeRange = "Not Set";
Console.WriteLine($"房間 {roomNumber} 關機");
SaveRoomsToFile("roomstates.txt");
var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer);
roomDetailsWindow.Shutdown_Click(null, null);
}
}
else
{
Console.WriteLine($"找不到房間: {roomNumber}");
}
}
catch (Exception ex)
{
Console.WriteLine($"錯誤: {ex.Message}");
}
});
}
}
public void SaveRoomsToFile(string filePath)
{
try
{
string fullPath = Path.GetFullPath(filePath);
var lines = Rooms.Select(r => $"{r.RoomPC};{r.RoomNumber};{r.Status};{r.TimeRange};{r.ServiceStatus}").ToList();
File.WriteAllLines(fullPath, lines);
Console.WriteLine("已保存房間狀態");
}
catch (Exception ex)
{
Console.WriteLine($"保存失敗: {ex.Message}");
MessageBox.Show($"Error saving file: {ex.Message}");
}
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
SaveRoomsToFile("roomstates.txt"); // 使用新的文件名
}
}
public class Room : INotifyPropertyChanged
{
private string _status;
private string _serviceStatus;
private string _timeRange;
private string _roomNumber;
public string RoomPC { get; set; }
public string RoomNumber
{
get => _roomNumber;
set
{
if (_roomNumber != value)
{
_roomNumber = value;
OnPropertyChanged();
}
}
}
public string Status
{
get => _status;
set
{
if (_status != value)
{
_status = value;
OnPropertyChanged();
}
}
}
public string TimeRange
{
get => _timeRange;
set
{
if (_timeRange != value)
{
_timeRange = value;
OnPropertyChanged();
}
}
}
public string ServiceStatus
{
get => _serviceStatus;
set
{
if (_serviceStatus != value)
{
_serviceStatus = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}