using BDU.Models; using MahApps.Metro.Controls; using Newtonsoft.Json; using NPOI.XSSF.Streaming.Values; using PropertyChanged; using System; using System.Collections.Generic; using System.Collections.ObjectModel; 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.Shapes; namespace BDU.Windows { /// /// DeviceSettingWindow.xaml 的交互逻辑 /// [AddINotifyPropertyChangedInterface] public partial class DeviceSettingWindow : MetroWindow { public bool IsSaved { get; private set; } = false; //设备预选模式开关 public bool IsSelectMode { get; set; } = false; public Visibility IsInputMode { get { if (IsSelectMode) return Visibility.Collapsed; return Visibility.Visible; } set; } public Visibility ShowComboBox { get { if (IsSelectMode) return Visibility.Visible; return Visibility.Collapsed; } set; } // 预选设备列表 public ObservableCollection PreSelectDevices { get; set; } = new(); // 当前选中的预配置设备 private DeviceModel? _selectedPreDefineDevice; public DeviceModel? SelectedPreDefineDevice { get => _selectedPreDefineDevice; set { _selectedPreDefineDevice = value; if (value != null && IsSelectMode) { LoadPreDefineDevice(value); } } } public DeviceModel? Device { get; set; } = new(); public ObservableCollection Types { get; set; } = ["串口", "Tcp", "Udp", "ModbusRtu_Tcp", "ModbusRtu_Udp", "ModbusRtu_Serial", "ModbusTcp", "CAN" ]; public ObservableCollection DeviceConnectSettings { get; set; } = []; /// /// 标记设备编辑操作是否为新增,如果不是,不能篡改设备类型 /// public bool IsAdd { get; set; } private string OriginalType; public DeviceSettingWindow() { InitializeComponent(); DataContext = this; IsAdd = true; PreSelectDevices = GetPreSelectDevices(); } public DeviceSettingWindow(DeviceModel device) { InitializeComponent(); DataContext = this; this.Device = device; OriginalType = device.Type; IsAdd = false; } private void Cancel_Click(object sender, RoutedEventArgs e) { Device = null; this.Close(); } private void Save_Click(object sender, RoutedEventArgs e) { IsSaved = true; Device!.ConnectString = JsonConvert.SerializeObject(DeviceConnectSettings); this.Close(); } private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (Device == null) return; if (Device!.Type == OriginalType) { DeviceConnectSettings = JsonConvert.DeserializeObject>(Device.ConnectString)!; return; } DeviceConnectSettings.Clear(); switch (Device!.Type) { case "Tcp": case "ModbusRtu_Tcp": case "ModbusTcp": DeviceConnectSettings.Add(new() { Name = "IP地址", Value = "127.0.0.1" }); DeviceConnectSettings.Add(new() { Name = "端口号", Value = "502" }); break; case "串口": case "ModbusRtu_Serial": DeviceConnectSettings.Add(new() { Name = "COM口", //Value = "" Value = "COM1" }); DeviceConnectSettings.Add(new() { Name = "波特率", Value = "9600" }); DeviceConnectSettings.Add(new() { Name = "数据位", Value = "8" }); DeviceConnectSettings.Add(new() { Name = "停止位", Value = "1" }); DeviceConnectSettings.Add(new() { Name = "奇偶", Value = "无" }); break; case "ModbusRtu_Udp": case "Udp": DeviceConnectSettings.Add(new() { Name = "IP地址", Value = "127.0.0.1" }); DeviceConnectSettings.Add(new() { Name = "端口号", Value = "502" }); DeviceConnectSettings.Add(new() { Name = "本地端口号", Value = "8080" }); break; } DeviceConnectSettings.Add(new() { Name = "读超时", Value = "3000" }); DeviceConnectSettings.Add(new() { Name = "写超时", Value = "3000" }); } private void GroupBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ChangedButton == MouseButton.Left) DragMove(); } //从预定义文件中获取预选设备列表 private ObservableCollection GetPreSelectDevices() { try { string filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, SystemConfig.Instance.PreDefineDevicesPath); if (!System.IO.File.Exists(filePath)) { // 如果文件不存在,创建一个空的配置文件 var emptyList = new ObservableCollection(); string json = JsonConvert.SerializeObject(emptyList, Formatting.Indented); System.IO.File.WriteAllText(filePath, json); return emptyList; } var devices = JsonConvert.DeserializeObject>( System.IO.File.ReadAllText(filePath)) ?? new ObservableCollection(); return devices; } catch (Exception ex) { MessageBox.Show($"加载预配置设备失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); return new ObservableCollection(); } } /// /// 加载预配置设备信息到当前设备 /// private void LoadPreDefineDevice(DeviceModel preDefineDevice) { if (Device == null) return; // 复制预配置设备的信息(除了ID,使用新的ID) Device.Name = preDefineDevice.Name; Device.Type = preDefineDevice.Type; Device.Description = preDefineDevice.Description; Device.ConnectString = preDefineDevice.ConnectString; // 触发类型选择变化,加载连接参数 OriginalType = Device.Type; if (!string.IsNullOrEmpty(Device.ConnectString)) { try { DeviceConnectSettings = JsonConvert.DeserializeObject>( Device.ConnectString) ?? new ObservableCollection(); } catch { // 如果反序列化失败,使用默认配置 ComboBox_SelectionChanged(null!, null!); } } } } }