using Check.Main.Camera; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Serialization; using WeifenLuo.WinFormsUI.Docking; namespace Check.Main.UI { public partial class FrmCamConfig : DockContent { // public List _settingsList = new List(); public List _settingsList { get; private set; } private readonly string _configFilePath = Path.Combine(Application.StartupPath, "cameras.xml"); public FrmCamConfig() { InitializeComponent(); _settingsList = new List(); LoadSettings(); RefreshListBox(); AdaptForDialogMode(); // 调整UI为对话框模式 } /// /// 用于从外部接收一个设置列表进行编辑。 /// /// 要编辑的相机设置列表 public FrmCamConfig(List settingsToEdit) { InitializeComponent(); // 创建一个现有列表的副本进行编辑,这样如果用户点“取消”,原始列表不会被影响 _settingsList = settingsToEdit != null ? settingsToEdit.Select(s => s.Clone() as CameraSettings).ToList() // 深度克隆更好,这里为简化用浅克隆 : new List(); // 别忘了为列表中的每个对象重新订阅事件 foreach (var setting in _settingsList) { setting.PropertyChanged += Setting_PropertyChanged; } RefreshListBox(); AdaptForDialogMode(); // 调整UI为对话框模式 } /// /// 【新增的方法】 /// 调整UI,使其更像一个对话框。 /// private void AdaptForDialogMode() { // 将“应用配置”按钮改为“确定” toolBtnSet.Text = "确定"; toolBtnSet.ToolTipText = "保存更改并关闭窗口"; // 新增一个“取消”按钮 var toolBtnCancel = new ToolStripButton("取消") { DisplayStyle = ToolStripItemDisplayStyle.Text, Alignment = ToolStripItemAlignment.Right // 靠右对齐 }; toolBtnCancel.Click += (sender, e) => { this.DialogResult = DialogResult.Cancel; this.Close(); }; toolStrip1.Items.Add(toolBtnCancel); } /// /// 【新增的事件处理方法】 /// 当PropertyGrid中的属性值被用户修改后触发此事件。 /// // 刷新左侧的相机列表 private void RefreshListBox() { listBoxCameras.Items.Clear(); foreach (var setting in _settingsList) { listBoxCameras.Items.Add(setting.Name); } } /// /// 【全新的事件处理方法】 /// 监听单个CameraSettings对象的属性变更通知。 /// private void Setting_PropertyChanged(object sender, PropertyChangedEventArgs e) { // 检查是不是“Name”属性发生了变化 if (e.PropertyName == nameof(CameraSettings.Name)) { // 'sender' 就是那个属性发生了变化的 CameraSettings 对象 var changedSetting = sender as CameraSettings; if (changedSetting == null) return; // 在 _settingsList 中找到这个对象的索引 int index = _settingsList.IndexOf(changedSetting); // 如果找到了,就更新ListBox中对应项的显示文本 if (index >= 0) { // 使用Invoke确保线程安全,虽然在此场景下通常不是问题,但这是个好习惯 this.Invoke(new Action(() => { listBoxCameras.Items[index] = changedSetting.Name; })); } } } private void listBoxCameras_SelectedIndexChanged(object sender, EventArgs e) { if (listBoxCameras.SelectedIndex >= 0) { propertyGrid1.SelectedObject = _settingsList[listBoxCameras.SelectedIndex]; } else { propertyGrid1.SelectedObject = null; } } private void toolBtnAdd_Click(object sender, EventArgs e) { var newSetting = new CameraSettings { Name = $"Camera-{_settingsList.Count + 1}" }; _settingsList.Add(newSetting); newSetting.PropertyChanged += Setting_PropertyChanged; RefreshListBox(); listBoxCameras.SelectedIndex = listBoxCameras.Items.Count - 1; } private void toolBtnRemove_Click(object sender, EventArgs e) { if (listBoxCameras.SelectedIndex >= 0) { _settingsList.RemoveAt(listBoxCameras.SelectedIndex); propertyGrid1.SelectedObject = null; RefreshListBox(); } } private void toolBtnSet_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.OK; this.Close(); } // 加载XML配置文件 private void LoadSettings() { if (!File.Exists(_configFilePath)) return; try { XmlSerializer serializer = new XmlSerializer(typeof(List)); using (FileStream fs = new FileStream(_configFilePath, FileMode.Open)) { _settingsList = (List)serializer.Deserialize(fs); } } catch (Exception ex) { MessageBox.Show("加载相机配置失败: " + ex.Message); } foreach (var setting in _settingsList) { setting.PropertyChanged += Setting_PropertyChanged; } } // 保存配置到XML文件 private void SaveSettings() { try { XmlSerializer serializer = new XmlSerializer(typeof(List)); using (FileStream fs = new FileStream(_configFilePath, FileMode.Create)) { serializer.Serialize(fs, _settingsList); } } catch (Exception ex) { MessageBox.Show("保存相机配置失败: " + ex.Message); } } } }