Files
CheckDevice/Check.Main/UI/FrmCamConfig.cs
17860779768 2e46747ba9 视觉修改
2025-08-25 16:33:58 +08:00

194 lines
6.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 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);
}
}
}
}