using System; using System.ComponentModel; using System.Drawing; using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Windows.Forms; using DPumpHydr.WinFrmUI.WenSkin.Controls; namespace DPumpHydr.WinFrmUI.WenSkin { public partial class WenConfig { public partial class WenConfigForm : Forms.WenForm { public WenConfigForm(WenConfig wenConfig) { this.Text = "系统设置 - " + wenConfig.ConfigName; this.Size = new Size(600, 440); var configControl = new WenConfigControl(wenConfig) { Dock = DockStyle.Fill }; configControl.WenConfigItemAdd += ConfigControl_WenConfigItemAdd; configControl.WenConfigItemClick += ConfigControl_WenConfigItemClick; configControl.WenConfigItemRemove += ConfigControl_WenConfigItemRemove; configControl.WenConfigItemValueChanged += ConfigControl_WenConfigItemValueChanged; this.Controls.Add(new WenConfigControl(wenConfig) { Dock = DockStyle.Fill }); } private void ConfigControl_WenConfigItemValueChanged(object sender, WenConfigControl.ConfigXmlItemValueEventArgs e) { this.WenConfigItemValueChanged?.Invoke(this, e); } private void ConfigControl_WenConfigItemRemove(object sender, WenConfigControl.WenConfigItemEventArgs e) { this.WenConfigItemRemove(this, e); } private void ConfigControl_WenConfigItemClick(object sender, WenConfigControl.WenConfigItemClickEventArgs e) { this.WenConfigItemClick?.Invoke(this, e); } private void ConfigControl_WenConfigItemAdd(object sender, WenConfigControl.WenConfigItemEventArgs e) { this.WenConfigItemAdd?.Invoke(this, e); } #region 委托 [Category("Wen"), Description("按钮点击事件")] public event WenConfigControl.WenConfigItemClickEventHandler WenConfigItemClick; [Category("Wen"), Description("移除项")] public event WenConfigControl.WenConfigItemEventHandler WenConfigItemRemove; [Category("Wen"), Description("新增项")] public event WenConfigControl.WenConfigItemEventHandler WenConfigItemAdd; [Category("Wen"), Description("值变化")] public event WenConfigControl.WenConfigItemValueEventHandler WenConfigItemValueChanged; [Category("Wen"), Description("保存数据")] public event WenConfigEventHandler WenConfigSaveChanged; #endregion } public partial class WenConfigControl : WenControl { public WenConfigControl(WenConfig wenConfig) { Initcom(); Text = "系统配置设置 - " + wenConfig.ConfigName; config = wenConfig; this.ForeColor = Color.White; this.BackColor = Color.FromArgb(37, 37, 38); ConfigLoad(); } private void Initcom() { this.flow = new FlowLayoutPanel { AutoScroll = true, WrapContents=false, FlowDirection = FlowDirection.TopDown, Dock = DockStyle.Fill, }; this.Controls.Add(this.flow); WenButton WenImageButton = new WenButton() { Text = "保存", Dock = DockStyle.Bottom, }; WenImageButton.Click += (s, e) => { config.Save(); WenConfigSaveChanged?.Invoke(this, new WenConfigEventArgs(this.config)); if (!string.IsNullOrWhiteSpace(SaveMessage)) MsgBoxInformation(SaveMessage); }; this.Controls.Add(WenImageButton); } #region 私有属性 private FlowLayoutPanel flow; private readonly WenConfig config; #endregion #region 公有属性 public string SaveMessage { get; set; } = "保存成功!部分设置需要重启软件才能生效!"; #endregion #region 委托事件 [Category("Wen"), Description("按钮点击事件")] public event WenConfigItemClickEventHandler WenConfigItemClick; [Category("Wen"), Description("移除项")] public event WenConfigItemEventHandler WenConfigItemRemove; [Category("Wen"), Description("新增项")] public event WenConfigItemEventHandler WenConfigItemAdd; [Category("Wen"), Description("值变化")] public event WenConfigItemValueEventHandler WenConfigItemValueChanged; [Category("Wen"), Description("保存数据")] public event WenConfigEventHandler WenConfigSaveChanged; [ComVisible(true)] public delegate void WenConfigItemClickEventHandler(object sender, WenConfigItemClickEventArgs e); public class WenConfigItemClickEventArgs : WenConfigItemEventArgs { public WenConfigItemClickEventArgs(bool showTextBox, WenConfigGroup configXmlGroup, WenConfigItem configXmlItem) : base(configXmlGroup, configXmlItem) { ShowTextBox = showTextBox; } public bool ShowTextBox { get; set; } } [ComVisible(true)] public delegate void WenConfigItemValueEventHandler(object sender, ConfigXmlItemValueEventArgs e); public class ConfigXmlItemValueEventArgs : WenConfigItemEventArgs { public ConfigXmlItemValueEventArgs(WenConfigGroup configXmlGroup, WenConfigItem configXmlItem, string changeValue) : base(configXmlGroup, configXmlItem) { ChangeValue = changeValue; State = true; } public string ChangeValue { get; set; } public bool State { get; set; } } [ComVisible(true)] public delegate void WenConfigItemEventHandler(object sender, WenConfigItemEventArgs e); public class WenConfigItemEventArgs : EventArgs { public WenConfigItemEventArgs(WenConfigGroup configGroup, WenConfigItem configItem) { WenConfigGroup = configGroup; WenConfigItem = configItem; } public WenConfigGroup WenConfigGroup { get; private set; } public WenConfigItem WenConfigItem { get; private set; } } [ComVisible(true)] public delegate void WenConfigEventHandler(object sender, WenConfigEventArgs e); public class WenConfigEventArgs : EventArgs { private readonly WenConfig wenConfig; public WenConfigEventArgs(WenConfig config) { this.wenConfig = config; } public WenConfig WenConfig => wenConfig; } #endregion private void ConfigLoad() { flow.Controls.Clear(); In(flow, this.config.Groups); void In(Control control, WenConfigGroupList groups) { foreach (WenConfigGroup gr in groups) { GroupBox groupBox = new GroupBox() { Name = gr.Name, Text = gr.Info, AutoSize = true, BackColor = Color.Transparent, ForeColor = ControlHelper.ColorReverse(this.BackColor), Visible = gr.Visible, }; FlowLayoutPanel flow = new FlowLayoutPanel() { Dock = DockStyle.Fill, AutoSize = true, FlowDirection = FlowDirection.TopDown }; FlowLayoutPanel flowItem = new FlowLayoutPanel() { Dock = DockStyle.Fill, AutoSize = true, FlowDirection = FlowDirection.TopDown }; flow.Controls.Add(flowItem); groupBox.Controls.Add(flow); foreach (WenConfigItem item in gr.Items) { ItemAdd(item); } void ItemAdd(WenConfigItem item) { WenConfigItemControl configXmlItemControl = new WenConfigItemControl(gr, item); configXmlItemControl.WenConfigItemClick += (s, e) => { //事件准发即可 WenConfigItemClick?.Invoke(this, e); }; configXmlItemControl.WenConfigItemRemove += (s, e) => { //移除内容界面需要更改 WenConfigItemRemove?.Invoke(this, e); gr.Items.Remove(item); flowItem.Controls.Remove(configXmlItemControl); }; configXmlItemControl.WenConfigItemValueChanged += (s, e) => { WenConfigItemValueChanged?.Invoke(this, e); }; flowItem.Controls.Add(configXmlItemControl); } //添加按钮 if (gr.AllowAdd) { flow.Controls.Add(AllowAddButton(gr, ItemAdd)); } control.Controls.Add(groupBox); if (gr.Groups.Count > 0) { In(flow, gr.Groups); } } } } #region 增添一个添加一项按钮 private WenButton AllowAddButton(WenConfigGroup group, Action action) { WenButton button = new WenButton() { Text = "新增一项", Size = new Size(500, 26) }; button.Click += (s, e) => { WenConfigItem configXmlItem = new WenConfigItem(group.Items) { Name = $"{group.Name}{group.Items.Count + 1:000}", Ecc = false, ReadOnly = false, Delete = true, Value = "", }; Forms.WenForm form = new Forms.WenForm() { StartPosition = FormStartPosition.CenterScreen, Size = new Size(300, 100), Text = "请输入名称" }; TextBox textBox = new TextBox() { Text = "新增名称", Dock = DockStyle.Fill, ScrollBars = ScrollBars.Both, WordWrap = false }; WenButton button1 = new WenButton() { Text = "确定", Dock = DockStyle.Bottom, }; button1.Click += (sx, ex) => { WenConfigItemAdd?.Invoke(this, new WenConfigItemEventArgs(group, configXmlItem)); configXmlItem.Info = textBox.Text; group.Items.Add(configXmlItem); action(configXmlItem); form.Dispose(); }; form.Controls.Add(textBox); form.Controls.Add(button1); form.ShowDialog(); }; return button; } #endregion #region 单项样式 [ToolboxItem(false)] private class WenConfigItemControl : WenControl { public WenConfigItemControl(WenConfigGroup gr, WenConfigItem item) : base() { if (item.DialogFile || item.DiaLogFolder) { this.Visible = item.Visible; var box = new WenDialogLableTextBox() { Dock = DockStyle.Fill, Name = item.Name, TextLable = item.Info, Text = item.Value, Password = item.Ecc, ReadOnly = item.ReadOnly, }; if (item.DialogFile) { box.Dialog = WenDialogLableTextBox.DialogStyle.File; box.Filter = item.Filter; } else if (item.DiaLogFolder) { box.Dialog = WenDialogLableTextBox.DialogStyle.Folder; } //按钮点击事件 box.ButtonClick += (s, e) => { WenConfigItemClickEventArgs ex = new WenConfigItemClickEventArgs(e.ShowTextBox, gr, item); WenConfigItemClick?.Invoke(this, ex); e.ShowTextBox = ex.ShowTextBox; }; if (item.Tip != null && !string.IsNullOrWhiteSpace(item.Tip)) { foreach (Control c in box.Controls) { tip.SetToolTip(c, item.Tip); } } box.Size = new Size(450, box.Height); box.TextBeforeChanged += (s, e) => { //值改变响应事件 ConfigXmlItemValueEventArgs configXmlItemValueEventArgs = new ConfigXmlItemValueEventArgs(gr, item, box.Text); WenConfigItemValueChanged?.Invoke(this, configXmlItemValueEventArgs); e.State = configXmlItemValueEventArgs.State; if (configXmlItemValueEventArgs.State) item.Value = box.Text; }; this.Controls.Add(box); //移除项目 按钮 if (gr.AllowAdd && item.Delete) { WenButton button = new WenButton() { Image = Properties.Resources.close, ImageSize = new Size(16, 16), Dock = DockStyle.Right, Size = new Size(20, 20) }; button.Click += (s, e) => { if (this.MsgBoxAsterisk("删除不可逆,是否删除")) { WenConfigItemRemove?.Invoke(this, new WenConfigItemEventArgs(gr, item)); } }; this.Controls.Add(button); } this.Size = new Size(500, box.Height); } else if (item.ComboBox) { this.Visible = item.Visible; comboBox = new WenLableComboBox() { Dock = DockStyle.Fill, Name = item.Name, TextLable = item.Info, DropDownStyle = item.ReadOnly ? ComboBoxStyle.DropDownList : ComboBoxStyle.DropDown, }; comboBox.Items.AddRange(item.Items.ToArray()); if (item.Tip != null && item.Tip.Length != 0) { foreach (Control c in comboBox.Controls) { tip.SetToolTip(c, item.Tip); } } comboBox.Text = item.Value; comboBox.TextChanged += (s, e) => { //值改变响应事件 ConfigXmlItemValueEventArgs configXmlItemValueEventArgs = new ConfigXmlItemValueEventArgs(gr, item, comboBox.Text); WenConfigItemValueChanged?.Invoke(this, configXmlItemValueEventArgs); if (configXmlItemValueEventArgs.State) item.Value = comboBox.Text; }; comboBox.Size = new Size(450, comboBox.Height); this.Controls.Add(comboBox); //移除项目 按钮 if (gr.AllowAdd && item.Delete) { WenButton button = new WenButton() { Image = Properties.Resources.close, ImageSize = new Size(16, 16), Dock = DockStyle.Right, Size = new Size(20, 20) }; button.Click += (s, e) => { if (this.MsgBoxAsterisk("删除不可逆,是否删除")) { WenConfigItemRemove?.Invoke(this, new WenConfigItemEventArgs(gr, item)); } }; this.Controls.Add(button); } this.Size = new Size(500, comboBox.Height + 3); } else { this.Visible = item.Visible; textBox = new WenLableTextBox() { Dock = DockStyle.Fill, Name = item.Name, TextLable = item.Info, Text = item.Value, Password = item.Ecc, ReadOnly = item.ReadOnly, }; //按钮点击事件 textBox.ButtonClick += (s, e) => { WenConfigItemClickEventArgs ex = new WenConfigItemClickEventArgs(e.ShowTextBox, gr, item); WenConfigItemClick?.Invoke(this, ex); e.ShowTextBox = ex.ShowTextBox; }; if (item.Tip != null && !string.IsNullOrWhiteSpace(item.Tip)) { foreach (Control c in textBox.Controls) { tip.SetToolTip(c, item.Tip); } } textBox.Size = new Size(450, textBox.Height); textBox.TextBeforeChanged += (s, e) => { //值改变响应事件 ConfigXmlItemValueEventArgs configXmlItemValueEventArgs = new ConfigXmlItemValueEventArgs(gr, item, textBox.Text); WenConfigItemValueChanged?.Invoke(this, configXmlItemValueEventArgs); e.State = configXmlItemValueEventArgs.State; if (configXmlItemValueEventArgs.State) item.Value = textBox.Text; }; this.Controls.Add(textBox); //移除项目 按钮 if (gr.AllowAdd && item.Delete) { WenButton button = new WenButton() { Image = Properties.Resources.close, ImageSize = new Size(16, 16), Dock = DockStyle.Right, Size = new Size(20, 20) }; button.Click += (s, e) => { if (this.MsgBoxAsterisk("删除不可逆,是否删除")) { WenConfigItemRemove?.Invoke(this, new WenConfigItemEventArgs(gr, item)); } }; this.Controls.Add(button); } this.Size = new Size(500, textBox.Height); } } #region 私有属性 private readonly ToolTip tip = new ToolTip(); private WenLableTextBox textBox; private WenLableComboBox comboBox; #endregion #region 委托事件 [Category("Wen"), Description("按钮点击事件")] public event WenConfigItemClickEventHandler WenConfigItemClick; [Category("Wen"), Description("移除一项")] public event WenConfigItemEventHandler WenConfigItemRemove; [Category("Wen"), Description("值发生变化")] public event WenConfigItemValueEventHandler WenConfigItemValueChanged; #endregion public new void Focus() { textBox?.Focus(); comboBox?.Focus(); } } #endregion } } }