BDU/ATS/Windows/DeviceSettingWindow.xaml.cs

263 lines
8.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// DeviceSettingWindow.xaml 的交互逻辑
/// </summary>
[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<DeviceModel> 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<string> Types { get; set; } = ["串口", "Tcp", "Udp", "ModbusRtu_Tcp", "ModbusRtu_Udp", "ModbusRtu_Serial", "ModbusTcp", "CAN" ];
public ObservableCollection<DeviceConnectSettingModel> DeviceConnectSettings { get; set; } = [];
/// <summary>
/// 标记设备编辑操作是否为新增,如果不是,不能篡改设备类型
/// </summary>
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<ObservableCollection<DeviceConnectSettingModel>>(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<DeviceModel> GetPreSelectDevices()
{
try
{
string filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, SystemConfig.Instance.PreDefineDevicesPath);
if (!System.IO.File.Exists(filePath))
{
// 如果文件不存在,创建一个空的配置文件
var emptyList = new ObservableCollection<DeviceModel>();
string json = JsonConvert.SerializeObject(emptyList, Formatting.Indented);
System.IO.File.WriteAllText(filePath, json);
return emptyList;
}
var devices = JsonConvert.DeserializeObject<ObservableCollection<DeviceModel>>(
System.IO.File.ReadAllText(filePath)) ?? new ObservableCollection<DeviceModel>();
return devices;
}
catch (Exception ex)
{
MessageBox.Show($"加载预配置设备失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
return new ObservableCollection<DeviceModel>();
}
}
/// <summary>
/// 加载预配置设备信息到当前设备
/// </summary>
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<ObservableCollection<DeviceConnectSettingModel>>(
Device.ConnectString) ?? new ObservableCollection<DeviceConnectSettingModel>();
}
catch
{
// 如果反序列化失败,使用默认配置
ComboBox_SelectionChanged(null!, null!);
}
}
}
}
}