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);
|
||
}
|
||
}
|
||
}
|
||
}
|