10.20PLC+相机2.3视觉修改
This commit is contained in:
		
							
								
								
									
										193
									
								
								Check.Main/UI/FrmCamConfig.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								Check.Main/UI/FrmCamConfig.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | ||||
| 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); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user