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(); } } /// /// MainWindow.xaml 的互動邏輯 /// public partial class MainWindow : Window, INotifyPropertyChanged { private ObservableCollection _rooms; private TcpServer _tcpServer; [DllImport("kernel32.dll")] static extern bool AllocConsole(); public MainWindow() { AllocConsole(); // 分配一个控制台窗口 Rooms = new ObservableCollection(); LoadRoomsFromFile("room.txt"); LoadRoomStatesFromFile("roomstates.txt"); // 加载房间的状态 DataContext = this; // 启动 TCP 服务器 _tcpServer = new TcpServer(1000); _tcpServer.MessageReceived += OnMessageReceived; // 订阅事件 _tcpServer.Start(); } public ObservableCollection Rooms { get => _rooms; set { _rooms = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string name = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } /// /// 當使用者點擊 Rectangle 物件時會觸發此事件 /// /// /// private void Rectangle_MouseDown(object sender, MouseButtonEventArgs e) { // 將 sender 轉換為 Rectangle 類型 var rect = sender as Rectangle; // 透過 DataContext 獲取關聯的 Room 物件 var room = rect.DataContext as Room; // 根據傳入的房間資料創建新的 RoomDetailsWindow 實例 // 並且傳遞房間資訊 (room) 以及 TCP 服務器 (_tcpServer) 給該視窗 var roomDetailsWindow = new RoomDetailsWindow(room, _tcpServer); // 顯示新創建的 RoomDetailsWindow 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)); } } }