194 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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<CameraSettings> _settingsList = new List<CameraSettings>();
 | ||
|         public List<CameraSettings> _settingsList { get; private set; }
 | ||
|         private readonly string _configFilePath = Path.Combine(Application.StartupPath, "cameras.xml");
 | ||
|         public FrmCamConfig()
 | ||
|         {
 | ||
|             InitializeComponent();
 | ||
|             _settingsList = new List<CameraSettings>();
 | ||
|             LoadSettings();
 | ||
|             RefreshListBox();
 | ||
|             AdaptForDialogMode(); // 调整UI为对话框模式
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 用于从外部接收一个设置列表进行编辑。
 | ||
|         /// </summary>
 | ||
|         /// <param name="settingsToEdit">要编辑的相机设置列表</param>
 | ||
|         public FrmCamConfig(List<CameraSettings> settingsToEdit)
 | ||
|         {
 | ||
|             InitializeComponent();
 | ||
| 
 | ||
|             // 创建一个现有列表的副本进行编辑,这样如果用户点“取消”,原始列表不会被影响
 | ||
|             _settingsList = settingsToEdit != null
 | ||
|                 ? settingsToEdit.Select(s => s.Clone() as CameraSettings).ToList() // 深度克隆更好,这里为简化用浅克隆
 | ||
|                 : new List<CameraSettings>();
 | ||
| 
 | ||
|             // 别忘了为列表中的每个对象重新订阅事件
 | ||
|             foreach (var setting in _settingsList)
 | ||
|             {
 | ||
|                 setting.PropertyChanged += Setting_PropertyChanged;
 | ||
|             }
 | ||
| 
 | ||
|             RefreshListBox();
 | ||
|             AdaptForDialogMode(); // 调整UI为对话框模式
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 【新增的方法】
 | ||
|         /// 调整UI,使其更像一个对话框。
 | ||
|         /// </summary>
 | ||
|         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);
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 【新增的事件处理方法】
 | ||
|         /// 当PropertyGrid中的属性值被用户修改后触发此事件。
 | ||
|         /// </summary>
 | ||
| 
 | ||
|         // 刷新左侧的相机列表
 | ||
|         private void RefreshListBox()
 | ||
|         {
 | ||
|             listBoxCameras.Items.Clear();
 | ||
|             foreach (var setting in _settingsList)
 | ||
|             {
 | ||
|                 listBoxCameras.Items.Add(setting.Name);
 | ||
|             }
 | ||
|         }
 | ||
|         /// <summary>
 | ||
|         /// 【全新的事件处理方法】
 | ||
|         /// 监听单个CameraSettings对象的属性变更通知。
 | ||
|         /// </summary>
 | ||
|         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<CameraSettings>));
 | ||
|                 using (FileStream fs = new FileStream(_configFilePath, FileMode.Open))
 | ||
|                 {
 | ||
|                     _settingsList = (List<CameraSettings>)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<CameraSettings>));
 | ||
|                 using (FileStream fs = new FileStream(_configFilePath, FileMode.Create))
 | ||
|                 {
 | ||
|                     serializer.Serialize(fs, _settingsList);
 | ||
|                 }
 | ||
|             }
 | ||
|             catch (Exception ex)
 | ||
|             {
 | ||
|                 MessageBox.Show("保存相机配置失败: " + ex.Message);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 |